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

时间:2011-06-26 20:12:01

标签: c# .net xml file-io

我目前有一个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文件都会被覆盖。

null中的第二个参数我有Encoding.UTF8XmlTextWriter,但它似乎不会改变非覆盖/覆盖功能。

4 个答案:

答案 0 :(得分:6)

您可以使用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结构:

<?xml version="1.0" encoding="utf-8"?>
<contacts>
  <contact>
    <firstName>Foo</firstName>
  </contact>
  <contact>
    <firstName>Bar</firstName>
  </contact>
</contacts>

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

void Main()
{
    var contacts = new List<Contact> 
    { 
        {new Contact { FirstName = "Bob", LastName = "Dole" }},
        {new Contact { FirstName = "Bill", LastName = "Clinton" }}
    };

    XmlSerializer serializer = new XmlSerializer(typeof(List<Contact>));
    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; }
}