[英]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.