基于标签拆分XML Etree:分离含指定子节点的familierelasjon
解决XML数据格式不匹配错误:拆分Etree处理不同节点类型
问题背景
循环XML响应填充列表时,含<relatertPersonUtenFolkeregisteridentifikator>子节点的<familierelasjon>标签会导致数据格式不匹配,触发Length of values (x) does not match length of index (y)错误。解决方案是将原Etree拆分为两个独立Etree,分别处理两类节点。
实现步骤
1. 提取所有目标节点
首先从原XML中获取所有<familierelasjon>节点:
from lxml import etree # 假设xml_content是你的XML响应内容 root = etree.fromstring(xml_content) all_familierelasjoner = root.xpath('//familierelasjon')
2. 按子节点存在性分类
遍历节点,将其分为“含指定子节点”和“不含指定子节点”两类:
# 初始化分类列表 with_subnode = [] without_subnode = [] for rel in all_familierelasjoner: # 检查当前节点是否包含目标子节点 has_target_subnode = bool(rel.xpath('./relatertPersonUtenFolkeregisteridentifikator')) if has_target_subnode: with_subnode.append(rel) else: without_subnode.append(rel)
3. 构建两个独立Etree
基于分类后的节点,创建两个新的Etree,保留原根节点的属性和标签:
# 构建含指定子节点的Etree root_with = etree.Element(root.tag, attrib=root.attrib) for node in with_subnode: root_with.append(node) tree_with = etree.ElementTree(root_with) # 构建不含指定子节点的Etree root_without = etree.Element(root.tag, attrib=root.attrib) for node in without_subnode: root_without.append(node) tree_without = etree.ElementTree(root_without)
后续处理
拆分完成后,你可以针对两个Etree分别编写数据填充逻辑:
- 对
tree_without,沿用原有逻辑提取字段,避免结构差异导致的长度不匹配; - 对
tree_with,额外处理<relatertPersonUtenFolkeregisteridentifikator>子节点下的内容,适配其数据结构。
内容的提问来源于stack exchange,提问作者Petter Corneliussen
相关产品推荐
相关产品推荐

