为什么XPATH count函数返回double而不是int
本文关键字:int double 返回 XPATH count 函数 为什么 | 更新日期: 2023-09-27 18:25:31
以下代码片段生成一个InvalidCastException。
static int XPathCount()
{
var doc = new XmlDocument();
doc.LoadXml(
@"<root>
<item>value1</item>
<item>value2</item>
<item>value3</item>
</root>");
var navigator = doc.CreateNavigator();
var expression = navigator.Compile("count(//item)");
var count = navigator.Evaluate(expression);
return (int) count;
}
我对这种行为感到惊讶,所以我将count()函数放入XPATH规范中:
count函数返回参数节点集中的节点数。
到目前为止还不错,但是,什么是数字?答案是相同的规格:
数字(浮点数)
显然,XPATH 2.0中已经修复了返回xs:integer的问题,但我仍然对此感到好奇。
有人知道W3C为什么决定在count()函数中使用十进制数吗?
它不是十进制。在XPath1.0中,它是一个IEEE双精度浮点数,在XPath2.0中是一个整数。
XPath1.0只有一个数字类型,原因与Javascript相同:在弱动态类型语言中,这是有意义的。此外,在设计XPath1.0时,Javascript被认为是宿主语言的主要候选者,这就是为什么数据类型与Javascript一致的原因。
如果您只有一个可用的数字类型,那么这就是count()必须返回的值。
Does anyone knows why W3C decided to use a decimal number for the count() function?
我认为它返回double
是因为它更通用,例如,如果您的Xml包含产品价格,而它只返回int
,那么您永远不会得到正确的价格总和。
从源代码来看,似乎所有函数都会返回double,甚至count,我想,因为除了count之外,所有其他函数都需要这个,但在某些情况下,count可能需要double,不确定在哪里,但可以。
示例:
double totalPrice = (double)navigator.Evaluate("sum(descendant::Product/price)");
<?xml version="1.0" encoding="utf-8" ?>
<Products>
<Product>
<name>Product1</name>
<price>8.99</price>
</Product>
<Product>
<name>Product2</name>
<price>12.99</price>
</Product>
</Products>
如果它只返回int
,则无法执行上述功能。由于您可以简单地将double
强制转换为int
,因此使用double
计数是非常合理的