使用带有联合运算符的XDocument.Descdants??和可为null的类型



编译器: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>

我只需要为某些key值获取AdditionalInfoItem

为了避免null错误,我尝试使用可为null的类型和联合运算符??

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不存在,则返回:

Sequence不包含任何元素。

我以这种方式结束了使用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循环并使用单行代码读取值?

仅在Where选择器之后尝试使用FirstOrDefault而不是First

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,因此下一个空检查?将继续。

相关内容

最新更新