将 XDocument.Descendants 与合并运算符一起使用 ??和可空类型
Using XDocument.Descendants with a coalesce operator ?? and nullable types
编译器: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 错误,我尝试使用可空类型和合并运算符 ??
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
不存在 returns:
Sequence contains no elements.
我以这种方式结束了使用 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")
return 0 个元素,你得到 Sequence contains no elements
异常,所以你不能得到它的 First
元素。 FirstOrDefault
returns null
而不是,所以下一个 nullcheck ?
继续。
编译器: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 错误,我尝试使用可空类型和合并运算符 ??
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
不存在 returns:
Sequence contains no elements.
我以这种方式结束了使用 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")
return 0 个元素,你得到 Sequence contains no elements
异常,所以你不能得到它的 First
元素。 FirstOrDefault
returns null
而不是,所以下一个 nullcheck ?
继续。