我目前有一个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.UTF8
和XmlTextWriter
,但它似乎不会改变非覆盖/覆盖功能。
答案 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; }
}