3

以下代码片段产生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()函数使用十进制数?

4

2 回答 2

3

它不是小数。在 XPath 1.0 中它是一个 IEEE 双精度浮点数,在 XPath 2.0 中它是一个整数。

XPath 1.0 有一个单一的数字类型,原因与 Javascript 相同:在弱动态类型语言中,它非常有意义。此外,在设计 XPath 1.0 时,Javascript 被认为是宿主语言的主要候选者,这就是数据类型与 Javascript 保持一致的原因。

如果您只有一种可用的数字类型,那么这就是 count() 必须返回的内容。

于 2013-07-31T06:39:41.723 回答
1
Does anyone knows why W3C decided to use a decimal number for the count() function?

我假设它返回double的功能更多,例如,如果您的 Xml 包含产品价格并且它只返回int,您将永远不会得到正确的价格总和。

看看源代码,似乎一切都返回双倍,甚至计数,我猜是因为所有其他函数都需要这个,除了计数,但可能在某些情况下计数需要一个双倍,不知道在哪里但它可以。

例子:

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转换为它,因此使用countint非常有意义double

于 2013-07-31T02:35:27.740 回答