Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python XPath-在单个查询中选择特定节点的前后同级_Python_Xml_Xpath - Fatal编程技术网

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