
当XML结构从26Alexi Delano改为Alexi Delano时,需将原基于子元素遍历的解析逻辑,改为直接读取元素的id属性并获取文本内容。
当xml结构从`
在处理Discogs等开放数据源的XML时,结构变更常导致解析器失效。原始代码依赖<members></members>下交替出现的<id></id>和<name></name>子元素,并使用itertools.grouper(或类似工具)成对提取:
from itertools import zip_longest
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
# 原逻辑(适用于 <id>26</id><name>Alexi...</name> 结构)
def element_members_old(self, element):
for id_elem, name_elem in grouper(element.iterchildren(), 2):
yield int(id_elem.text), name_elem.text.strip()但新结构中,id已作为<name></name>元素的属性存在,且每个<name></name>即为独立成员项(不再嵌套于统一<members></members>容器内——注意题干示例末尾有截断,合理补全应为<name id="27">Cari Lekebusch</name>)。因此解析逻辑需根本性调整:
✅ 正确做法是:直接访问当前element(即<name></name>标签)的id属性,并取其.text内容:
def element_members(self, element):
# element 即 <name id="26">Alexi Delano</name>
member_id = element.get('id')
if member_id is None:
raise ValueError(f"Missing 'id' attribute in <{element.tag}> element")
yield int(member_id), element.text.strip() if element.text else ""⚠️ 关键注意事项:
立即学习“Python免费学习笔记(深入)”;
-
element.get('id')安全返回None(而非抛异常),务必校验以避免int(None)错误; -
element.text可能为空或仅含空白符,建议用.strip()并处理None情况; - 若实际XML中
<name></name>仍被包裹在<members></members>内(如<members><name id="26">...</name><name id="27">...</name></members>),则需先遍历element.findall('name'),再对每个子元素调用上述逻辑; - 不要误用
element.attrib['id']——它在属性不存在时会触发KeyError,get()更健壮。
此修改简洁、高效,完全适配属性驱动的XML设计,也符合discogs-xml2db项目中element_*方法的单元素处理契约(即每个方法接收一个语义明确的XML节点)。


















