我有一组XML文件,它们有两个可能的根节点值,但具有相同的结构和子元素。我遍历每个文件并构建一个r
类型的对象Object
,然后我将其添加到新的objects
集合中:
foreach (var file in files)
{
var r = from x in file.Descendants("RootNode")
select new Object
{
Field = ((string) x.Element("Field"))
};
objects.AddRange(r);
}
我想做类似的事情:
var r = from x in file.Descendants("RootNode") || file.Descendants("OtherRootNote")
但除了有两个循环之外,无法弄清楚这样做的逻辑方式。这是唯一的方法吗?
答案 0 :(得分:1)
您可以使用Descendants()
枚举所有后代,然后添加标准where
clause以过滤具有所需名称的内容:
var r = from x in file.Descendants()
where x.Name == "RootNode" || x.Name == "OtherRootNode"
select new Object
{
Field = ((string)x.Element("Field"))
};
从reference source开始,Descendants()
的{{3}}只需要在元素树中进行线性遍历,因此自己进行名称检查在计算上并不复杂。