以下代码片段会产生 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 specification:
count函数返回参数node-set中的节点数。
到目前为止这么好,但号是什么?答案在同一规范中:
数字(浮点数)
显然在XPATH 2.0已修复此问题以返回xs:整数但我仍然对此感到好奇。
有谁知道为什么W3C决定使用十进制数作为 count()函数?
答案 0 :(得分:3)
这不是小数。在XPath 1.0中,它是一个IEEE双精度浮点数,在XPath 2.0中它是一个整数。
XPath 1.0有一个数字类型,原因与Javascript相同:在弱动态类型语言中,它非常有意义。此外,在设计XPath 1.0时,Javascript被认为是主机语言的主要候选者,这就是数据类型与Javascript一致的原因。
如果您只有一种可用的数字类型,那么count()必须返回。
答案 1 :(得分:1)
Does anyone knows why W3C decided to use a decimal number for the count() function?
我认为它返回double
因为它更具通用性,例如,如果您的Xml包含产品价格而且只返回int
,您将永远无法得到正确的价格总和。
并且查看source它似乎一切都返回双倍,甚至计数,我想因为除了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
用于计数