編譯器:Visual Studio 2019
框架:.Net 2.1
給定一個像這樣的 XML 檔案:
<root>
<data>
<AdditionalOrderInfo>
<AdditionalInfoItem key="{4567B566-A0A2-4214-B7E7-814FE179CDFC}" value="ScanItDental"/>
<AdditionalInfoItem key="GlobalOrderID" value="EDC531BE6A0D4DC5BFEA0C6081D9F26B"/>
<AdditionalInfoItem key="CreatedIn" value="2.20.1.2"/>
</AdditionalOrderInfo>
</data>
</root>
我AdditionalInfoItem只需要獲取某些key值。
為了避免空錯誤,我嘗試使用可為空型別和合并運算子 ??
var additionalOrderInfo = document.Descendants(ns "AdditionalOrderInfo").First();
var value = additionalOrderInfo.Descendants(ns "AdditionalInfoItem")?.Where(el => el.Attribute("key").Value == "SomeKey")?.First()?.Attribute("value")?.Value ?? "";
但如果key不存在則回傳:
序列不包含任何元素。
我已經以foreach這種方式結束了使用回圈:
var additionalOrderInfo = document.Descendants(ns "AdditionalOrderInfo").First();
foreach (var item in additionalOrderInfo.Descendants(ns "AdditionalInfoItem"))
{
switch (item.Attribute("key").Value)
{
case "SomeKey1":
Order.SomeKey1 = item.Attribute("value").Value;
break;
case "SomeKey2":
Order.SomeKey2 = item.Attribute("value").Value;
break;
}
}
有沒有辦法避免foreach回圈并使用一行代碼讀取值?
uj5u.com熱心網友回復:
嘗試使用FirstOrDefault而不是First僅在Where選擇器之后:
var value = additionalOrderInfo.Descendants(ns "AdditionalInfoItem")?
.Where(el => el.Attribute("key").Value == "SomeKey")?
.FirstOrDefault()? // <--- Here
.Attribute("value")?.Value ?? "";
如果Where(el => el?.Attribute("key")?.Value == "SomeKey")回傳 0 個元素,則會出現Sequence contains no elements例外,因此無法獲取其中的First元素。相反FirstOrDefault回傳null,所以下一個空?檢查繼續進行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/352929.html
標籤:C# xml 林克 linq-to-xml
