XElement.XPathEvaluate 没有正确评估指数数

XElement.XPathEvaluate not evaluating exponential numbers correctly

在我的 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# 代码中修复此问题的任何方法?

XPath 2.0 允许它们——但是 XPathEvaluate 只支持 XPath 1.0。这不是XElement的缺点; .NET 从未在 1.0 之后添加支持。

如果您必须在此处使用 XPath,请参阅 this list 以获得 third-party 支持。

如果您本身不需要使用 XPath 进行计算,而只是在寻找一种在 C# 中执行此操作的方法,那当然很简单:

var value = x.XPathSelectElements(@"/Vals[@id=""Val2""]/*").Sum(s => (double) s);

但是如果 Sum 部分应该从您可以传入的任意表达式动态执行,您将需要一个完整的 XPath 处理器。