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

时间:2014-07-29 15:48:58

标签: 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;

}

3 个答案:

答案 0 :(得分:2)

我将您的问题解释为如何使用LINQ to XML(XDocumentXElement等)从某些数据创建XML元素。构建LINQ to XML是为了支持所谓的functional construction,它允许您在单个语句中创建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>

答案 1 :(得分:1)

我认为你应该阅读一些类似于msdn的文档:

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

然后滚动到底部确实很有帮助,这里有一个例子。

在实践中,您新建了一些新的XElements,并将它们添加到其他元素中,这些元素不一定是根元素。

答案 2 :(得分:1)

您可以将每个<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)))
        );