2013-07-31 52 views
1

以下代碼段產生InvalidCastException爲什麼XPATH計數函數返回一個double而不是int?

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; 
    } 

我很驚訝的這種行爲讓我看看計數()函數進入XPATH specification

count函數返回在參數節點設置節點的數量。

到目前爲止好,但是,什麼是號碼?答案是同規格:

號(一個浮點數)

顯然,這已被固定在XPATH 2.0返回一個xs:整數,但我還是好奇這一點。

有誰知道爲什麼W3C決定使用一個十進制數作爲count()函數?

回答

2

這不是一個小數。在XPath 1.0中,它是一個IEEE雙精度浮點數,在XPath 2.0中它是一個整數。

XPath 1.0具有單一的數字類型,其原因與Javascript相同:使用弱動態類型語言,它具有相當大的意義。另外,在設計XPath 1.0時,Javascript被認爲是主機語言的主要候選對象,這就是爲什麼數據類型與Javascript保持一致的原因。

如果您只有一個可用的數值類型,那麼count()必須返回。

1
Does anyone knows why W3C decided to use a decimal number for the count() function? 

我認爲它返回double爲更靈活,例如,如果你的XML包含產品的價格,它纔會返回int你永遠不會得到價格的正確總和。

並看着source它似乎一切都返回雙重,甚至計數,我猜想,因爲所有其他函數將需要這個除了計數,但可能會有一些情況下,計數將需要雙倍,不知道在哪裏,但它可以。

例子:

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它,就不可能做到上述功能。因爲你可以簡單地投doubleint它是非常有意義的使用double計數

+0

我明白你的觀點。也許XPATH規範試圖儘可能與類型相關,並定義一個數字來涵蓋所有可能的結果。 – michelgb

相關問題