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

Posted

技术标签:

【中文标题】在 C# 中使用 XDocument 创建 XML 文件【英文标题】:XML file creation using XDocument in C# 【发布时间】:2011-02-26 06:08:28 【问题描述】:

我有一个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 结构?

【问题讨论】:

请贴出你目前写的代码。人们通常不喜欢只为您编写代码。 同意——这实际上在一个语句中非常简单,但是仅仅给你答案并不能帮助你学到很多东西。 【参考方案1】:

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

我特意使用了这种代码布局,以使代码本身反映文档的结构。

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

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

【讨论】:

注意:如果您有需要“内部文本”的元素,您可以像这样添加它们:new XElement("description","this is the inner text of the description element.");(类似于添加属性/值对的方式) 非常好的方法。我挣扎了一会儿如何一次添加属性和元素的 linq 表达式。所以如果有人感兴趣,我选择:new XElement("info", new object[] new XAttribute("foo", "great"), new XAttribute("bar", "not so great") .Concat(list.Select(x =&gt; new XElement("child", ...)))) 加上适当的换行,这看起来还不错。【参考方案2】:

使用 .Save 方法意味着输出将有一个 BOM,并非所有应用程序都会对此感到满意。 如果您不想要 BOM,并且如果您不确定,那么我建议您不要,然后通过编写器传递 XDocument:

using (var writer = new XmlTextWriter(".\\your.xml", new UTF8Encoding(false)))

    doc.Save(writer);

【讨论】:

以上是关于在 C# 中使用 XDocument 创建 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 使用 XDocument 解析 XML [重复]

在 C# 中使用 Saxon-HE 对 XDocument 执行具有给定上下文的 XQuery

当数据集WriteXml()函数生成xml文件时,C#如何使用XDocument类更新xml文件

在 XDocument 中使用 ':' 字符生成 Excel - C#

使用 xmlReader 在 C# 中过滤特定元素值的大型 XML

循环遍历 XDocument 的后代 - C#