我希望创建一个包含多个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;
}
答案 0 :(得分:2)
我将您的问题解释为如何使用LINQ to XML(XDocument
,XElement
等)从某些数据创建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)
将返回具有FirstName
和LastName
属性的对象。
然后,您可以使用功能构造在单个语句中创建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)))
);