[英]XDocument: get the first child element of type 'a' or 'b'
我有以下标记,其中每个item
元素必须只包含一个a
, b
, c
或d
元素,此外还可以包含各种其他元素。 所需( a
, b
...类型)元素的位置不确定。
<root>
<item>
<a>...</a>
...
<item>
<item>
...
<d>...</d>
<item>
<item>
<c>...</c>
<item>
...
</root>
使用XDocument ,我该如何表达以下内容:
返回
a
,b
,c
或d
类型的第一个子元素。
我目前正在使用一系列if-else语句,但这种亵渎必须去; 对于这样一个看似简单的任务来说,这似乎太过分了:
foreach (XElement xItem in xmlDoc.Root.Elements("item"))
{
if (xItem.Element("a") != null)
{
// element <a>...</a> found
}
else if (xItem.Element("b") != null)
{
// element <b>...</b> found
}
...
}
您可以使用FirstOrDefault
执行此任务:
var firstAorBorCorD = xmlDoc.Root
.Elements("item")
.Select(xItem =>
xItem.Elements().FirstOrDefault(sub =>
sub.Name == "a" || sub.Name == "b" || sub.Name == "c" || sub.Name == "d"
)
);
这将为每个item
生成一系列{a,b,c,d}类型的第一个子item
。 如果特定项目没有所需类型的子项,则列表中的相应条目将为null
。
听起来你可能想要这样的东西:
var names = new XName[] { "a", "b", "c", "d" };
var element = xmlDoc.Root
.Elements("item")
.Elements()
.FirstOrDefault(x => names.Contains(x.Name));
据我所知,你仍然希望保持for循环,因为你想对元素相对于其包含的Item
做一些事情,但你想让代码获得第一个a
, b
, c
或d
元素更清洁。
以下是如何做到这一点:
var names = new XName[] { "a", "b", "c", "d" };
foreach (XElement xItem in xmlDoc.Root.Elements("item"))
{
var element = xItem.Elements().FirstOrDefault(x => names.Contains(x.Name));
//Do something with element
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.