我有以下标记,其中每个item
元素必须只包含一个a
,b
,c
或{{ 1}}元素,另外还可以包含各种附加元素。所需(d
,a
...类型)元素的位置不确定。
b
使用XDocument,我该如何表达以下内容:
返回
<root> <item> <a>...</a> ... <item> <item> ... <d>...</d> <item> <item> <c>...</c> <item> ... </root>
,a
,b
或c
类型的第一个子元素。
我目前正在使用一系列if-else语句,但这种亵渎必须去;对于这样看似简单的任务来说似乎太过分了:
d
答案 0 :(得分:1)
您可以使用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}类型的第一个子序列。如果特定项目没有所需类型的子项,则列表中的相应条目将为null
。
答案 1 :(得分:1)
听起来你可能想要这样的东西:
var names = new XName[] { "a", "b", "c", "d" };
var element = xmlDoc.Root
.Elements("item")
.Elements()
.FirstOrDefault(x => names.Contains(x.Name));
答案 2 :(得分:1)
据我所知,你仍然希望保留for循环,因为你想对元素相对于它包含Item
做一些事情,但你想让代码得到第一个{{1} },a
,b
或c
元素清洁。
以下是如何做到这一点:
d