XDocument:获取类型' a'的第一个子元素。或者' b'

时间:2016-01-05 15:45:59

标签: c# xml linq-to-xml

我有以下标记,其中每个item元素必须只包含一个abc或{{ 1}}元素,另外还可以包含各种附加元素。所需(da ...类型)元素的位置不确定。

b

使用XDocument,我该如何表达以下内容:

  

返回<root> <item> <a>...</a> ... <item> <item> ... <d>...</d> <item> <item> <c>...</c> <item> ... </root> abc类型的第一个子元素。

我目前正在使用一系列if-else语句,但这种亵渎必须去;对于这样看似简单的任务来说似乎太过分了:

d

3 个答案:

答案 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} },abc元素清洁。

以下是如何做到这一点:

d