1

我正在构建一个零件应用程序以学习 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

4 回答 4

5

我个人建议使用 LINQ to XML。这是一个XmlDocument.

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

这是一个创建与您已经获得的相同 XML 的示例(除了声明:您想使用 Latin-1 而不是可以代表整个 Unicode 的 UTF-8 之类的任何原因顺便说一句?)

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

诚然,我希望您希望将“创建零件元素”位封装到一种方法中,以避免一直重复它……但希望您能明白这一点。

于 2010-10-06T17:16:22.630 回答
0

The code above does exactly what it looks like: writes an element "MyParts" and then writes a child element "parts" and then a child element "item" with a value of whatever is in your text box.

This smells suspiciously like homework, and is readily Google-able, so I'm only going to give a quick pseudo-answer.

You (may) want to:

  1. Create appropriate class(es) for parts that have the members you want
  2. Create a collection of those items
  3. Update that in-memory collection from your UI
  4. Save the collection using the XML formatting and functionality of your choice (including but not limited to what you are doing above, or LINQ to XML, or XML Serialization, or...)
于 2010-10-06T17:20:06.793 回答
0

您是否考虑过使用 .NET 附带的开箱即用的 XML 序列化?您只需在某个集合中填充您的对象,然后使用 XML 序列化器将其保存到文件中。然后,您可以使用 DeSerializer 水合您的对象。

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

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

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

于 2010-10-06T18:27:32.817 回答
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();

    }

一般的想法是,对于部件列表中的每个部件,您编写“部件”(应该是“部件”?)标签及其所有内容,填充itemcolor以及size来自Part类的数据,这是最简单的形式可能:

class Part
{
    public string Item { get; set; }
    public Color Color { get; set; }
    public string Size { get; set; }
}
于 2010-10-06T17:18:38.350 回答