在我的C#程序中,我正在加载一个System.Xml.Linq.Xelement
变量,其中包含XML文件的一部分我尝试解析并向其提供各种XPath以评估使用XPathEvaluate()
方法的值
我的挑战是我的XML有一些数字存储为指数数字而XPath忽略了它们,即使我读过XPath 2.0应该允许这些被理解为数字。
示例如下:
XML(childNode
):
<Parent>
<Vals id="Val1">
<abc>1.8</abc>
</Vals>
<Vals id="Val2">
<abc>4.8552829108959736E-5</abc>
<def>4.940657864520423E-4</def>
<ghi>0.1262403356384331</ghi>
<jkl>0.0</jkl>
</Vals>
</Parent>
XPath(myXPath
):
sum(Parent/Vals[@id="Val2"]/*[self::abc | self::def | self::ghi | self::jkl][number(.)=number(.)])
我的代码如下:
var value= childNode.XPathEvaluate(myXPath);
我希望价值是:
value = 4.8552829108959736E-5 + 4.940657864520423E-4 + 0.126240335638433 + 0
= 0.126782954253994
但是,我得到了:
value = 0.126240335638433 + 0
= 0.126240335638433
有关这方面的任何想法可以在我的C#代码中修复吗?
答案 0 :(得分:1)
XPath 2.0允许它们 - 但XPathEvaluate
仅支持XPath 1.0。这不是XElement
的缺点; .NET从未在1.0之后添加支持。
如果您必须在此处使用XPath,请参阅this list以获取第三方支持。
如果您不需要使用XPath进行计算,但只是想在C#中找到一种方法,那当然很简单:
var value = x.XPathSelectElements(@"/Vals[@id=""Val2""]/*").Sum(s => (double) s);
但是如果Sum
部分应该是从你可以传入的任意表达式动态执行的,那么你需要一个完整的XPath处理器。