XPath - 在单个查询中选择特定节点的前后兄弟

时间:2013-12-03 17:57:31

标签: python xml xpath

我目前正在使用Open Street Maps数据,我正在尝试选择特定节点的前后兄弟。

我的查询目前看起来像这样:

/osm/way/nd[@ref=203936110]/following-sibling::nd[1]
/osm/way/nd[@ref=203936110]/preceding-sibling::nd[1]

这些查询按预期工作,但我想将它们合并到一个查询中。我确实发现some examples提到这是可能的,但由于某种原因,我无法找到合适的语法来使其发挥作用。

例如,此查询无效:

/osm/way/nd[@ref=203936110]/(following-sibling::nd[1] or preceding-sibling::nd[1])

1 个答案:

答案 0 :(得分:1)

如果您使用的是lxml(目前只有supports XPath version 1.0),则必须完全拼出每个XPath,并使用|加入它们:

'''/osm/way/nd[@ref=203936110]/following-sibling::nd[1] 
   | /osm/way/nd[@ref=203936110]/preceding-sibling::nd[1]'''

例如,

import lxml.etree as ET
content = '''\
<record>
    <nd>First</nd>
    <nd>Second</nd>
    <nd ref="203936110"></nd>
    <nd>Third</nd>
    <nd>Fourth</nd>    
</record>'''
root = ET.fromstring(content)

for elt in root.xpath('''
    //nd[@ref="203936110"]/following-sibling::nd[1]
    |
    //nd[@ref="203936110"]/preceding-sibling::nd[1]'''):

    print(elt.text)

产量

Second
Third