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

個人的には、LINQtoXMLを使用することをお勧めします。よりもはるかに簡単に使用できるAPIですXmlDocument

ただし、はい。既存のドキュメントを変更する場合は、通常、ストリーミングAPIを使用するよりもメモリ内表現を使用する方が簡単です。もちろん後者を行うことは可能ですが、それは簡単ではありません

これは、すでに持っているものと同じXMLを作成する例です(宣言以外:Unicode全体を表すことができるUTF-8のようなものの代わりにLatin-1を使用したい理由はありますか?)

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

ループを使用すると、次のようになります。

    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のデータを入力することです。可能性があります:colorsizePart

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

上記のコードは、まさにそのように見えます。要素「MyParts」を書き込み、次に子要素「parts」を書き込み、次に子要素「item」をテキストボックスにある値で書き込みます。

これは宿題のようなにおいがして、すぐにGoogleに対応できるので、簡単な疑似回答のみを行います。

あなたは(かもしれない)したい:

  1. 必要なメンバーを持つパーツに適切なクラスを作成します
  2. それらのアイテムのコレクションを作成します
  3. UIからそのメモリ内コレクションを更新します
  4. 選択したXMLフォーマットと機能を使用してコレクションを保存します(上記で行っていること、LINQ to XML、XMLシリアル化などを含みますが、これらに限定されません)。
于 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 に答える