Python XPath-在单个查询中选择特定节点的前后同级
我目前正在处理开放式街道地图数据,并尝试选择特定节点的前一个和后一个同级 我的查询当前如下所示:Python XPath-在单个查询中选择特定节点的前后同级,python,xml,xpath,Python,Xml,Xpath,我目前正在处理开放式街道地图数据,并尝试选择特定节点的前一个和后一个同级 我的查询当前如下所示: /osm/way/nd[@ref=203936110]/following-sibling::nd[1] /osm/way/nd[@ref=203936110]/preceding-sibling::nd[1] 这些查询按预期工作,但我希望将它们合并到单个查询中。我确实发现这是可能的,但出于某种原因,我一直无法找到正确的语法使其工作 例如,此查询无效: /osm/way/nd[@ref=20393
/osm/way/nd[@ref=203936110]/following-sibling::nd[1]
/osm/way/nd[@ref=203936110]/preceding-sibling::nd[1]
这些查询按预期工作,但我希望将它们合并到单个查询中。我确实发现这是可能的,但出于某种原因,我一直无法找到正确的语法使其工作
例如,此查询无效:
/osm/way/nd[@ref=203936110]/(following-sibling::nd[1] or preceding-sibling::nd[1])
如果您使用的是lxml(目前仅限于此),则必须完整地拼写每个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)
您也可以在谓词中“或”它们:'//nd[后面的兄弟姐妹::nd[1][@ref=“203936110”]或前面的兄弟姐妹::nd[1][@ref=“203936110”]]“但我认为联合节点集可能是一种更好的方法。@brjaga:这将匹配具有后续兄弟姐妹或之前兄弟姐妹的
nd
s,而不是兄弟姐妹本身。我们正在寻找的节点是nd
s(后续兄弟姐妹::nd[1]
)。//nd[@ref=“blah”]/后面的同级::nd[1]
找到的节点与//nd[前面的同级::nd[1][@ref=“blah”]]
找到的节点相同(您可以使用上面的示例进行检查)。总的来说,我确实认为联合选项更优雅,但我遇到过某些情况,在这种情况下,我只能在谓词中使用轴。@brjaga:Oops,我错调了——你是对的。这是一个有趣的选择。
Second
Third