2012-01-01 105 views
0

我有下面的XML文档:XPath查询问题

<places xmlns="http://where.yahooapis.com/v1/schema.rng" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:start="0" yahoo:count="1" yahoo:total="1"> 
    <place yahoo:uri="http://where.yahooapis.com/v1/place/23424975" xml:lang="en-US"> 
     <woeid>23424975</woeid> 
     <placeTypeName code="12">Country</placeTypeName> 
     <name>United Kingdom</name> 
     <country type="Country" code="GB">United Kingdom</country> 
     <centroid> 
      <latitude>54.314072</latitude> 
      <longitude>-2.230010</longitude> 
     </centroid> 
     <boundingBox> 
      <southWest> 
       <latitude>49.162090</latitude> 
       <longitude>-13.413930</longitude> 
      </southWest> 
      <northEast> 
        <latitude>60.854691</latitude> 
       <longitude>1.768960</longitude> 
      </northEast> 
     </boundingBox> 
     <areaRank>11</areaRank> 
     <popRank>0</popRank> 
    </place> 
</places> 

我试图捕捉 “WOEID” 值。但是我使用的“/ places/place/woeid”的XPath查询不会捕获它。

任何想法?

谢谢。

回答

2

您必须在查询中指定一个名称空间。如何设置名称空间取决于您的XPath实现。但是您必须声明http://where.yahooapis.com/v1/schema.rng命名空间,然后将其用作路径表达式。因此,如果您将其声明为yahoo例如,您的XPath表达式看起来像/yahoo:places/yahoo:place/yahoo:woeid

或者,您的XPath实现可能允许您设置默认名称空间,在这种情况下,您的原始查询将正常工作。请注意,由于xmlns属性没有名称空间前缀,因此所有封闭元素(未用其自身名称空间覆盖)属于该名称空间(Yahoo名称空间)。所以名称空间实际上是元素名称的一部分。了解名称空间如何工作对于使用XML非常重要。

1

集命名空间和前缀(如a)在您的XPath引擎,然后使用:

a:places/a:place/a:woeid 

或者干脆:

*[local-name() = 'places']/*[local-name() = 'place']/*[local-name() = 'woeid']