繁体   English   中英

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

[英]XDocument: get the first child element of type 'a' or 'b'

我有以下标记,其中每个item元素必须只包含一个abcd元素,此外还可以包含各种其他元素。 所需( ab ...类型)元素的位置不确定。

<root>
  <item>
    <a>...</a>
    ...
  <item>

  <item>
    ...
    <d>...</d>
  <item>

  <item>
    <c>...</c>
  <item>

  ...
</root>

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

返回abcd类型的第一个子元素。

我目前正在使用一系列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做一些事情,但你想让代码获得第一个abcd元素更清洁。

以下是如何做到这一点:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM