如何在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;
}
我将您的问题解释为如何使用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)
将返回一个具有FirstName
和LastName
属性的对象。
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,并将它们添加到其他元素中,这些元素不一定是根元素。