XElement.XPathEvaluate未正确评估指数数字

时间:2018-03-07 17:22:49

标签: c# xpath xelement system.xml

在我的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#代码中修复吗?

1 个答案:

答案 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处理器。