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 处理器。
在我的 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 处理器。