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

本文关键字:xelement 节点 foreach 循环 创建 | 更新日期: 2023-09-27 18:15:21

我希望创建一个具有多个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;
}

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

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

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

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)将返回一个具有FirstNameLastName属性的对象。

然后,您可以使用函数式结构在单个语句中创建XML元素:
var xElement = new XElement("Names",
  names.Select(
    name => new XElement("Name",
      new XElement("FirstName", name.FirstName),
      new XElement("LastName", name.LastName)
    )
  )
);

代码的结构和缩进反映了生成的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>

您可以将每个<Name>的字符串解析为XElement而不是XDocument,例如:

var doc = XDocument.Parse("<Names></Names>");
for (int i = 0; i < 10; i++)
{
    var str = GetName(i);
    var name = XElement.Parse(str);
    doc.Root.Add(name);
}

或使用LINQ:

更花哨(但可读性较差?)
doc.Root
   .Add(
        Enumerable.Range(0, 10)
                  .Select(i => XElement.Parse(GetName(i)))
        );

我认为你应该阅读一些文档,比如msdn:

http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement (v = vs.110) . aspx

然后滚动到底部很有帮助,那里有一个例子

实际上,您创建了一些新的xelement,并将它们添加到其他元素中,这些元素不一定是根元素。