在C#中使用XDocument创建XML文件

Tho*_*eld 78 c# xml linq-to-xml

我有一个List<string>"sampleList",其中包含

Data1
Data2
Data3...
Run Code Online (Sandbox Code Playgroud)

文件结构就像

<file>
   <name filename="sample"/>
   <date modified ="  "/>
   <info>
     <data value="Data1"/> 
     <data value="Data2"/>
     <data value="Data3"/>
   </info>
</file>
Run Code Online (Sandbox Code Playgroud)

我目前正在使用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");
Run Code Online (Sandbox Code Playgroud)

如何使用XDocument创建相同的XML结构?

Jon*_*eet 181

LINQ to XML通过三个功能使这更加简单:

  • 您可以在不知道其所属文档的情况下构造对象
  • 您可以构造一个对象并将子项作为参数提供
  • 如果参数是可迭代的,那么它将被迭代

所以你可以这样做:

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");
}
Run Code Online (Sandbox Code Playgroud)

我故意使用这种代码布局来使代码本身反映文档的结构.

如果你想要一个包含文本节点的元素,你可以通过将文本作为另一个构造函数参数传入来构造它:

// Constructs <element>text within element</element>
XElement element = new XElement("element", "text within element");
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果你有需要"内部文本"的元素,你可以像这样添加它们:`new XElement("description","这是description元素的内部文本.");`(类似于你添加属性的方式) /值对) (16认同)