簡體   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