我正在处理以下结构的 XML 文件:
<vco:ItemDetail>
<cac:Item>
...
<cac:RecommendedRetailPrice>
<cbc:PriceAmount amountCurrencyID="EUR">4.95</cbc:PriceAmount>
<cbc:BaseQuantity quantityUnitCode="EA">1</cbc:BaseQuantity>
</cac:RecommendedRetailPrice>
...
</cac:Item>
...
</vco:ItemDetail>
和RecommendedRetailPrice
/或PriceAmount
可能不存在于每个Item
. 不过,我想Items
按它们各自的RecommendedRetailPrices
. 所以我最终得到了以下代码,它工作正常,但必须在一些可怕的嵌套 if 语句中的每个阶段检查空值:
//full_xml is of type XDocument
var most_expensive = full_xml
.Element("ItemDetails")
.Elements(vco + "ItemDetail")
.Elements(cac + "Item")
.OrderBy(el =>
{
var rrp = el.Element(cac + "RecommendedRetailPrice");
string val = null;
if(rrp != null) {
var pa = rrp.Element(cbc + "PriceAmount");
if(pa != null) {
val = rrp.Value;
}
}
if (val != null) {
return Convert.ToDouble(val);
}
else {
return 0.0;
}
}
)
.Last();
在这种情况下,这可能不是那么糟糕,但我想必须有一种更惯用的方式来做到这一点。考虑按向下 8 层的可选子节点对某些内容进行排序。
任何帮助表示赞赏。