C#将数据添加到xml文件

我正在构建一个Parts应用程序,以便学习C#和WPF。 我尝试使用XmlWriter添加新部件时遇到问题。 我可以创建xml文件,但无法确定如何添加其他部分。 我应该使用像XmlDocument这样的东西吗? 这是我的代码背后:

private void btnSave_Click(object sender, RoutedEventArgs e) { XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = Encoding.UTF8; settings.Indent = true; using (XmlWriter writer = XmlWriter.Create("f:\\MyParts.xml", settings)) { writer.WriteStartDocument(); writer.WriteStartElement("MyParts"); writer.WriteStartElement("parts"); writer.WriteStartElement("item"); writer.WriteString(txtbxitem.Text); writer.WriteEndElement(); writer.WriteStartElement("color"); writer.WriteString(txtbxcolor.Text); writer.WriteEndElement(); writer.WriteStartElement("size"); writer.WriteString(txtbxsize.Text); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndDocument(); writer.Flush(); writer.Close(); } } 

此代码正确创建xml文件和节点,但如何添加其他部分? 这是我想要创建的:

     Part1 Red SM   Part2 Blue XXL   

我个人建议使用LINQ to XML。 这是一个比XmlDocument更容易使用的API。

但是,是的,如果要修改现有文档,那么通常使用内存中表示比使用流API更简单。 当然可以做后者,但这并不容易。

这是一个创建相同XML的例子(除了声明之外:你有什么理由想要使用Latin-1而不是像UTF-8那样可以代表整个Unicode,顺便说一下?)

 var doc = new XDocument( new XElement("MyParts", new XElement("parts", new XElement("item", "Part1"), new XElement("color", "Red"), new XElement("size", "SM")), new XElement("parts", new XElement("item", "Part2"), new XElement("color", "Blue"), new XElement("size", "XXL")))); 

然后,如果你想添加另一部分:

 doc.Root.Add( new XElement("parts", new XElement("item", "Part3"), new XElement("color", "Green"), new XElement("size", "L"))); 

不可否认,我希望你想要将“创建一个零件元素”位封装到一个方法中,以避免一直重复它……但希望你能得到它。

使用循环,你会得到类似的东西:

  var parts = new List() { ...... parts here ...... }; using (XmlWriter writer = XmlWriter.Create("f:\\MyParts.xml", settings)) { writer.WriteStartDocument(); writer.WriteStartElement("MyParts"); foreach(var part in parts) { writer.WriteStartElement("parts"); writer.WriteStartElement("item"); writer.WriteString(part.Item); writer.WriteEndElement(); //  writer.WriteStartElement("color"); writer.WriteString(part.Color); writer.WriteEndElement(); writer.WriteStartElement("size"); writer.WriteString(part.Size); writer.WriteEndElement(); //  writer.WriteEndElement(); //  } writer.WriteEndElement(); //  writer.WriteEndDocument(); writer.Flush(); writer.Close(); } 

一般的想法是,对于部件列表中的每个部分,您使用Part类中的数据编写“部件”(应该是“部件”?)标签及其所有内容,填充itemcolorsize ,最简单的forms可能是:

 class Part { public string Item { get; set; } public Color Color { get; set; } public string Size { get; set; } } 

上面的代码完全按照它的样子:写一个元素“MyParts”,然后写一个子元素“parts”,然后写一个子元素“item”,其值为文本框中的任何内容。

这有点像家庭作业,并且很容易谷歌,所以我只会给出一个快速的伪答案。

你(可能)想要:

  1. 为具有所需成员的零件创建适当的类
  2. 创建这些项的集合
  3. 从UI更新内存中集合
  4. 使用您选择的XML格式和function保存集合(包括但不限于您在上面执行的操作,或LINQ to XML,或XML序列化,或…)

您是否考虑过使用.NET附带的现成XML序列化? 您只需在某个集合中填充对象,然后使用XML Serializer持久保存到文件中。 然后,您可以使用DeSerializer来水合您的物体。

这将允许您在应用程序的UI(WPF)和逻辑上花费更多时间。 您需要做的就是为您的类提供所有Seri​​alizable属性。

这是一个很好的例子: http : //www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

最大的好处是随着时间的推移构建数据对象,序列化/反序列化将随之增长。