c# - 如何在 foreach 循环中创建具有多个 xelement 节点的顶级 xelement

标签 c# .net xml linq-to-xml

我希望创建一个具有多个 XElement 子节点的顶级 XElement,如下所示。

<Names>
    <Name>
        <firstname>Mike</firstname>
        <lastname>Smith</lastname>
    </Name>
    <Name>
        <firstname>Sam</firstname>
        <lastname>Smith</lastname>
    </Name>
    <Name>
        <firstname>Michelle</firstname>
        <lastname>Smith</lastname>
    </Name>
</Names>

如果我使用类似于下面的内容,我如何将子元素(元素)附加到顶级元素?感谢您的任何建议。

for (int i = 0; i < 10; i++)
{
    var str = GetName(i);
    //str is a string that contains xml
    XDocument doc = XDocument.Parse(str);
    XElement nameEle = doc.Root;

}

最佳答案

我将您的问题解释为如何使用 LINQ to XML(XDocumentXElement 等)从某些数据创建 XML 元素。 LINQ to XML 的构建是为了支持所谓的 functional construction。它允许您在单个语句中创建 XML 树。在我看来,这是创建 XML 元素而不是改变现有结构的最佳方式。

要创建 XML 元素,您需要一些数据,这些数据的格式应为 IEnumerable<T>。序列(LINQ 的基本接口(interface))。我的小示例使用匿名类型数组:

var names = new[] {
  new { FirstName = "Mike", LastName = "Smith" },
  new { FirstName = "Sam", LastName = "Smith" },
  new { FirstName = "Michelle", LastName = "Smith" }
};

您还可以创建 IEnumerable<T>使用函数调用的序列:

var names = Enumerable.Range(0, 10).Select(i => GetName(i));

这假设GetName(i)将返回一个具有 FirstName 的对象和一个 LastName属性(property)。

然后您可以使用函数构造在单个语句中创建 XML 元素:

var xElement = new XElement("Names",
  names.Select(
    name => new XElement("Name",
      new XElement("FirstName", name.FirstName),
      new XElement("LastName", name.LastName)
    )
  )
);

代码的结构和缩进反射(reflect)了生成的 XML 并使其易于理解正在发生的事情:

<Names>
  <Name>
    <FirstName>Mike</FirstName>
    <LastName>Smith</LastName>
  </Name>
  <Name>
    <FirstName>Sam</FirstName>
    <LastName>Smith</LastName>
  </Name>
  <Name>
    <FirstName>Michelle</FirstName>
    <LastName>Smith</LastName>
  </Name>
</Names>

关于c# - 如何在 foreach 循环中创建具有多个 xelement 节点的顶级 xelement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25019554/

相关文章:

java - 每次使用不同的属性文件多次运行 Ant

java - 从 xml 获取特定值

xml - 使用 shellscript 在 XML 中搜索字符串或数字时获取父标记

c# - 非静态文本框需要对象引用

c# - 无需编译即可使用 xml 进行本地化?

c# - 为什么此代码忽略等待并继续进行?

c# - 如何阻止 GraphicsPath 关闭

c# - 如何使用c#获取其他进程的环境变量

c# - 已设置 EF6 'DbConfigurationClass' 但未发现此类型 - 多个 DbContexts 和 DbConfigurations

c# - Visual C# - 我应该为这个任务使用什么样的表单控件?