C#でXDocumentを使用したXMLファイルの作成


83

List<string>含む「sampleList」があります

Data1
Data2
Data3...

ファイル構造は次のようなものです

<file>
   <name filename="sample"/>
   <date modified ="  "/>
   <info>
     <data value="Data1"/> 
     <data value="Data2"/>
     <data value="Data3"/>
   </info>
</file>

私は現在、これを行うためにXmlDocumentを使用しています。

例:

List<string> lst;
XmlDocument XD = new XmlDocument();
XmlElement root = XD.CreateElement("file");
XmlElement nm = XD.CreateElement("name");
nm.SetAttribute("filename", "Sample");
root.AppendChild(nm);
XmlElement date = XD.CreateElement("date");
date.SetAttribute("modified", DateTime.Now.ToString());
root.AppendChild(date);
XmlElement info = XD.CreateElement("info");
for (int i = 0; i < lst.Count; i++) 
{
    XmlElement da = XD.CreateElement("data");
    da.SetAttribute("value",lst[i]);
    info.AppendChild(da);
}
root.AppendChild(info);
XD.AppendChild(root);
XD.Save("Sample.xml");

XDocumentを使用して同じXML構造を作成するにはどうすればよいですか?


8
これまでに書いたコードを投稿してください。人々は一般的にあなたのためにあなたのコードを書くことを好まない。
ミッチウィート2010年

5
同意しました-これは実際には1つのステートメントで行うのは非常に簡単ですが、答えを与えるだけでは多くを学ぶことはできません。
Jon Skeet 2010年

回答:


191

LINQ to XMLを使用すると、次の3つの機能により、これをはるかに簡単にすることができます。

  • オブジェクトが含まれているドキュメントを知らなくても、オブジェクトを作成できます
  • オブジェクトを作成し、子を引数として提供できます
  • 引数が反復可能である場合、それは繰り返されます

だからここであなたはただすることができます:

void Main()
{
    List<string> list = new List<string>
    {
        "Data1", "Data2", "Data3"
    };

    XDocument doc =
      new XDocument(
        new XElement("file",
          new XElement("name", new XAttribute("filename", "sample")),
          new XElement("date", new XAttribute("modified", DateTime.Now)),
          new XElement("info",
            list.Select(x => new XElement("data", new XAttribute("value", x)))
          )
        )
      );

    doc.Save("Sample.xml");
}

このコードレイアウトを意図的に使用して、コード自体にドキュメントの構造を反映させました。

テキストノードを含む要素が必要な場合は、別のコンストラクター引数としてテキストを渡すだけでそれを構築できます。

// Constructs <element>text within element</element>
XElement element = new XElement("element", "text within element");

16
注:「内部テキスト」が必要な要素がある場合は、次のように追加します:(new XElement("description","this is the inner text of the description element.");属性と値のペアを追加する方法と同様)
Myster 2010年

とても素敵なアプローチ。属性と要素のlinq式を一度に追加する方法に少し苦労しました。したがって、誰かが興味を持っている場合は、次のように選択します。new XElement("info", new object[] { new XAttribute("foo", "great"), new XAttribute("bar", "not so great") }.Concat(list.Select(x => new XElement("child", ...))))適切な行の折り返しを使用すると、これもまったく問題ないように見えます。
Sebastian Werk

0

.Saveメソッドを使用すると、出力にBOMが含まれることになりますが、すべてのアプリケーションが満足できるわけではありません。BOMが必要ない場合、および不明な場合は、必要ないことをお勧めします。次に、XDocumentをライターに渡します。

using (var writer = new XmlTextWriter(".\\your.xml", new UTF8Encoding(false)))
{
    doc.Save(writer);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.