You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:35:25