将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
的第二个参数设置了null
和Encoding.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; } }
- 如果模型实现了INotifyPropertyChanged,ViewModel应该如何注册/取消注册PropertyChanged事件?
- C#null coalescing运算符返回null
- 支持通配符的System.StringComparer(*)
- Facebook .NET客户端SDK是否支持通过AppStudio生成的通用应用程序/应用程序?
- ASP.NET MVC中的模型关系
- Session.Clear(),Session.Abandon(),Session.RemoveAll()的MVC优化?
- 转换为通用基类失败
- Path.Combine()在驱动器号后面不添加目录分隔符
- 为什么Nullable 无法编译但是int? 没有’使用系统;’