将XML写入文件而不覆盖以前的数据

我目前有一个C#程序,它使用.NET Framework将数据写入XML文件。

if (textBox1.Text!="" && textBox2.Text != "") { XmlTextWriter Writer = new XmlTextWriter(textXMLFile.Text, null); Writer.WriteStartDocument(); Writer.WriteStartElement("contact"); Writer.WriteStartElement("firstName"); Writer.WriteString(textBox1.Text); Writer.WriteEndElement(); Writer.WriteEndElement(); Writer.WriteEndDocument(); Writer.Close(); } else { MessageBox.Show("Nope, fill that textfield!"); } 

问题是我每次尝试保存新内容时都会覆盖我的XML文件。

我已经为XmlTextWriter的第二个参数设置了nullEncoding.UTF8 ,但它似乎并没有改变非覆盖/覆盖function。

您可以使用XDocument :

 public static void Append(string filename, string firstName) { var contact = new XElement("contact", new XElement("firstName", firstName)); var doc = new XDocument(); if (File.Exists(filename)) { doc = XDocument.Load(filename); doc.Element("contacts").Add(contact); } else { doc = new XDocument(new XElement("contacts", contact)); } doc.Save(filename); } 

然后像这样使用:

 if (textBox1.Text != "" && textBox2.Text != "") { Append(textXMLFile.Text, textBox1.Text); } else { MessageBox.Show("Nope, fill that textfield!"); } 

这将创建/附加到以下XML结构的联系人:

    Foo   Bar   

将数据添加到XML文件的唯一方法是读取数据,添加数据,然后再次写出完整的文件。

如果您不想将整个文件读入内存,则可以使用流接口(例如, XmlReader / XmlWriter )来交错读取,追加和写入。

只是为了添加Darin的答案,这篇文章是我准备在我自己的答案中包含的,作为如何使用XDocument将节点附加到现有XML文档的一个很好的参考:

http://davidfritz.wordpress.com/2009/07/10/adding-xml-element-to-existing-xml-document-in-c/

我不会手动写出XML,而是考虑使用XmlSerializer和通用List。 看起来您的需求很简单,因此内存使用并不是很重要。 要添加项目,您必须加载列表并再次将其写出。

 void Main() { var contacts = new List { {new Contact { FirstName = "Bob", LastName = "Dole" }}, {new Contact { FirstName = "Bill", LastName = "Clinton" }} }; XmlSerializer serializer = new XmlSerializer(typeof(List)); TextWriter textWriter = new StreamWriter(@"contacts.xml"); serializer.Serialize(textWriter, contacts); textWriter.Close(); } public class Contact { public string FirstName { get; set; } public string MiddleName { get; set; } public string LastName { get; set; } }