如何获取XML前后标签的属性值(含无同级标签场景)
解决方案:通用XML标签前后id获取(兼容不同标签类型与边界情况)
问题根源
之前的代码存在两个关键限制:
- 仅匹配同类型标签的前后节点(
preceding::tagX),无法处理DOC2这类混合标签类型的场景 - 直接取列表索引
[0],未处理无前驱/后继标签的边界情况(比如DOC3的无前驱场景),导致触发IndexError
修复后的代码
改用通用节点匹配替代指定标签名,并增加空值判断避免索引错误:
from lxml import etree def get_adjacent_ids(root): result = [] # 匹配所有id以B开头的任意标签 target_elements = root.xpath('//*[starts-with(@id, "B")]') for el in target_elements: # 获取前一个任意类型标签(不限制标签名) prec_nodes = el.xpath('preceding::*[1]') if prec_nodes: result.append(prec_nodes[0].get('id')) # 获取后一个任意类型标签 foll_nodes = el.xpath('following::*[1]') if foll_nodes: result.append(foll_nodes[0].get('id')) return result # 对应三类DOC的测试示例 # DOC1(同类型标签) doc1_root = etree.fromstring('<root><tagX id="ABB"/><tagX id="BXX"/><tagX id="CDN"/></root>') print(get_adjacent_ids(doc1_root)) # 输出: ['ABB', 'CDN'] # DOC2(混合标签) doc2_root = etree.fromstring('<root><tagA id="AA"/><tagB id="BYY"/><tagC id="C"/></root>') print(get_adjacent_ids(doc2_root)) # 输出: ['AA', 'C'] # DOC3(无前驱标签) doc3_root = etree.fromstring('<root><tagX id="BZZ"/><tagY id="CXC"/></root>') print(get_adjacent_ids(doc3_root)) # 输出: ['CXC']
关键改动说明
//*[starts-with(@id, "B")]:匹配所有标签类型中id以B开头的节点preceding::*[1]/following::*[1]:匹配目标节点的前/后第一个任意类型标签,不再限制标签名- 增加
if prec_nodes:/if foll_nodes:判断:仅当存在对应节点时才获取id,避免空列表索引错误
内容的提问来源于stack exchange,提问作者jfontana
相关产品推荐
相关产品推荐

