在不覆盖先前数据的情况下将XML写入文件

4

我目前有一个使用.NET Framework编写数据到XML文件的C#程序。

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,但似乎这并没有改变不覆盖/覆盖的功能。

2
所以您实际上想要向XML文件中添加内容。请参阅http://social.msdn.microsoft.com/Forums/da-DK/xmlandnetfx/thread/0f3eaa85-ecc4-424d-b766-3fc8e26f7b12和http://www.tkachenko.com/blog/archives/000053.html。 - jao
4个回答

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

为什么在Linq上不能使用using关键字呢?我尝试了System.Xml.Linq.XDocument,甚至只是System.Linq和其他几种变体,但似乎它不在我的库中。 - Johnston
由于某些原因,我无法将LINQ包含到我的资源中,但我真的很喜欢你的做法。最终我只能使用一种效率低下的方法将内容追加到文件末尾。谢谢! - Johnston

5

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

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


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; }
}

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接