为什么XPATH计数函数返回double而不是int?

时间:2013-07-31 02:14:56

标签: c# xpath

以下代码片段会产生 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()函数?

2 个答案:

答案 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用于计数

是完全合理的