仅使用XPath选择第一个实例?

时间:2009-01-17 11:50:07

标签: xml xpath

我正在解析一些像这样的XML:

<root>
    <some_gunk/>
    <dupe_node>
        ...
        stuff I want
        ...
    </dupe_node>
    <bits_and_pieces/>
    <other_gunk/>
    <dupe_node>
        ...
        stuff I don't want
        ...
    </dupe_node>
    <more_gunk/>
</root>

'//dupe_node'的XPath会给我两个dupe_node个实例。我只想穿越第一个。我可以用XPath做到这一点吗?

3 个答案:

答案 0 :(得分:42)

/descendant::dupe_node[1]

//dupe_node[1]通常是错误的,尽管它在这种特殊情况下会产生相同的结果。 See docs

  

位置路径// para [1]与位置路径/ descendant :: para [1]的含义不同。后者选择第一个后代para元素;前者选择所有后代的para元素,这些元素是他们父母的第一个孩子。

给出以下XML:

<foo>
    <bar/>
    <foo>
        <bar/>
    </foo>
</foo>

//bar[1]将生成两个节点,因为这两个节点都是其各自父节点的第一个子节点。

/descendant::bar[1]将只提供一个节点,这是文档中所有小节的第一个。

答案 1 :(得分:6)

//dupe_node[1]

XPath从1开始计数,在这种情况下不是0。您可以使用此工具在浏览器中尝试:

http://www.xmlme.com/XpathTool.aspx?mid=82

答案 2 :(得分:4)

// dupe_node [1]