2013-07-31 4 views
1

다음 코드 단편은 입니다. InvalidCastException입니다. 나는이 행동에 놀랐다왜 XPATH 개수 함수가 int 대신 double을 반환합니까?

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수() 기능을 보면 :

카운트 함수는 인수의 노드 집합에서 노드의 수를 반환합니다.

지금까지 너무 좋아하지만하는 은 무엇인가? 대답은 같은 사양에 있습니다

번호 (부동 소수점 숫자) 분명히이 XPATH 2.0에서 수정되었습니다

는 XS를 반환 : 여전히 정수 그러나 나는 이것에 대해 호기심.

왜 W3C가 count() 함수에 10 진수를 사용하기로 결정했는지 아는 사람이 있습니까?

답변

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? 

나는 당신의 XML은 제품 가격이 포함 된 경우는 예를 들어, 그것의 더 다양한으로 double을 반환 가정 그것은 단지 당신이 가격의 정확한 금액을 결코 것 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 사양은 형식과 관련된 가능한 한 중립적 인 시도를하고 가능한 모든 결과를 다루기 위해 Number를 정의했을 수도 있습니다. – michelgb

관련 문제