XPath查询问题

时间:2012-01-01 20:54:43

标签: xml xpath

我有以下XML文档:

<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 个答案:

答案 0 :(得分:2)

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

或者,您的XPath实现可能允许您设置默认命名空间,在这种情况下,您的原始查询可以正常工作。

请记住,由于xmlns属性没有名称空间前缀,所有包含的元素(没有用自己的名称空间覆盖)都属于该名称空间(Yahoo名称)。因此命名空间实际上是元素名称的一部分。了解命名空间的工作方式对于使用XML非常重要。

答案 1 :(得分:1)

在XPath引擎中设置名称空间和前缀(例如a),然后使用:

a:places/a:place/a:woeid

或简单地说:

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