XElement.XPathEvaluate not evaluating exponential numbers correctly

只愿长相守 提交于 2019-12-11 04:35:10

问题


In my C# Program, I am loading a System.Xml.Linq.Xelement variable with a portion of an XML file I'm trying to parse and feeding it various XPaths to evaluate values for using the XPathEvaluate() method.

My challenge is that my XML has some numbers stored as exponential numbers and the XPath is ignoring them even though I'm reading that XPath 2.0 should allow for these being understood to be numbers.

A sample would look as follows:

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(.)])

and my code looks like:

var value= childNode.XPathEvaluate(myXPath);

I would expect the value to be:

value = 4.8552829108959736E-5 + 4.940657864520423E-4 + 0.126240335638433 + 0
      = 0.126782954253994

But, rather I get:

value = 0.126240335638433 + 0
      = 0.126240335638433

Any thoughts about any way this can be fixed in my C# code?


回答1:


XPath 2.0 does allow them -- but XPathEvaluate only supports XPath 1.0. This is not a shortcoming of XElement; .NET never added support past 1.0.

If you must use XPath here, see this list for third-party support.

If you don't need to do use XPath for the calculation per se but are just looking for a way to do this in C#, that's simple enough of course:

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

But if the Sum part is supposed to be performed dynamically from arbitrary expressions you can pass in, you'll need a full XPath processor.



来源:https://stackoverflow.com/questions/49157805/xelement-xpathevaluate-not-evaluating-exponential-numbers-correctly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!