xml.etree如何获取含指定属性子标签的node节点
解决方案
不需要先定位子<tag>再反向查找父节点,直接调整XPath的筛选逻辑,就能直接返回目标<node>元素。
正确XPath写法
.//node[tag/@v="traffic_signals"]
写法说明:
- 把对
<tag>子节点的属性校验放在<node>后的方括号谓词中,含义是匹配所有满足「存在v属性为traffic_signals的tag子节点」的node元素 - 你之前的写法将查询路径终点设为
<tag>,所以返回结果自然是匹配到的tag标签,而非上层node。
可运行示例
import xml.etree.ElementTree as ET xml_content = '''<root> <node id="1416646243" /> <node id="1416646244"> <tag k="crossing" v="unregulated" /> </node> <node id="1416646245"> <tag k="crossing" v="traffic_signals" /> </node> </root>''' root = ET.fromstring(xml_content) target_node = root.find('.//node[tag/@v="traffic_signals"]') print(target_node.attrib) # 输出 {'id': '1416646245'},即为目标node节点
反向查父节点的通用方法
如果在其他场景下你已经拿到了子元素,确实需要反向获取父节点,可以手动构建父节点映射表,无需依赖第三方库:
# 遍历全量节点构建 子节点->父节点 的映射关系 parent_map = {child: parent for parent in root.iter() for child in parent} # 假设已经拿到了匹配的tag元素 tag_element = root.find('.//node/tag[@v="traffic_signals"]') # 直接从映射表取对应的父node即可 target_node = parent_map[tag_element]
内容的提问来源于stack exchange,提问作者icanfast
相关产品推荐
相关产品推荐

