为什么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()函数中使用十进制数吗?

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

它不是十进制。在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计数是非常合理的