gpt4 book ai didi

c# - 通过可能丢失的子节点在 LINQ 中排序 XML

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:18 25 4
gpt4 key购买 nike

我正在处理以下结构的 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 都存在。尽管如此,我还是想按照它们各自的 RecommendedRetailPrices 对所有 Items 进行排序。所以我最终得到了以下代码,它工作正常,但必须在一些可怕的嵌套 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 级的可选子节点对某些内容进行排序。

感谢任何帮助。

最佳答案

如果可以存在零个或一个元素,那么我会使用 Elements() 而不是 Element() 然后选择 FirstOrDefault。然后使用 explicit cast operators XElement 来获得你的值(value)。

像这样

var most_expensive = full_xml
.Element("ItemDetails")
.Elements(vco + "ItemDetail")
.Elements(cac + "Item")
.OrderBy(el =>
el.Elements(cac + "RecommendedRetailPrice")
.Select(rrp => (double?) rrp.Elements(cbc + "PriceAmount"))
.FirstOrDefault() ?? 0.0
).Last();

关于c# - 通过可能丢失的子节点在 LINQ 中排序 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17040592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com