1

在我的 C# 程序中,我正在加载一个System.Xml.Linq.Xelement变量,其中包含我试图解析的 XML 文件的一部分,并为其提供各种 XPath 以评估使用该XPathEvaluate()方法的值。

我的挑战是我的 XML 将一些数字存储为指数数字,即使我正在阅读 XPath 2.0 应该允许将这些数字理解为数字,XPath 也会忽略它们。

示例如下所示:

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# 代码中修复的任何方法的任何想法?

4

1 回答 1

1

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

如果您必须在此处使用 XPath,请参阅此列表以获取第三方支持。

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

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

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

于 2018-03-07T18:21:08.350 回答