C#将数据添加到xml文件

时间:2010-10-06 17:13:04

标签: c# xmldocument xmlwriter

我正在构建一个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文件和节点,但如何添加其他部分?以下是我要创建的内容:

 <?xml version="1.0" encoding="ISO-8859-1" ?> 

<MyParts>
  <parts>
    <item>Part1</item>
    <color>Red</color>
    <size>SM</size>
  </parts>
  <parts>
    <item>Part2</item>
    <color>Blue</color>
    <size>XXL</size>
  </parts>
</MyParts>

4 个答案:

答案 0 :(得分:5)

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

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

这是一个创建相同XML的示例(除了声明之外:任何理由你想要使用Latin-1而不是像UTF-8这样的东西可以代表整个Unicode,btw?)

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")));

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

答案 1 :(得分:0)

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

    var parts = new List<Part>() { ...... 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(); // </item>

            writer.WriteStartElement("color");
            writer.WriteString(part.Color);
            writer.WriteEndElement();

            writer.WriteStartElement("size");
            writer.WriteString(part.Size);
            writer.WriteEndElement(); // </size>

            writer.WriteEndElement(); // </parts>
        }
        writer.WriteEndElement(); // </MyParts>
        writer.WriteEndDocument();

        writer.Flush();
        writer.Close();

    }

一般的想法是,对于部件列表中的每个部分,您编写“部分”(应该是“部分”?)标记及其所有内容,填充item,{{1}和color来自size类的数据,最简单的形式可能是:

Part

答案 2 :(得分:0)

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

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

你(可能)想要:

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

答案 3 :(得分:0)

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

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

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

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