1. ホーム
  2. c#

[解決済み] C#でXDocumentを使用したXMLファイルの作成

2023-05-23 21:07:14

質問

私は 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構造を作成するにはどうすればよいですか?

どのように解決するのですか?

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