Python多层嵌套XML转CSV时父子节点字段映射错误如何解决
多层嵌套XML转CSV父子节点属性匹配错误修复
问题根因
现有代码将工单节点遍历、备注节点遍历拆成了两个完全独立的循环,遍历备注时没有关联备注所属的工单节点,直接复用了第一个循环最后留存的display_id变量,导致所有备注都绑定了同一个账号ID,匹配关系完全错乱。
修复逻辑
不要跨层级全局查找备注节点,改为以单个<helpdesk-ticket>工单节点为遍历单位:
- 每读取一个工单节点,先提取该工单对应的
account-id - 仅在当前工单节点的子节点范围内查找所有下属备注
- 将当前工单ID和每条备注一一配对后存入结果列表,即可保证关联关系正确
修正后完整代码
import xml.etree.ElementTree as Xet import pandas as pd cols = ["account-id","notes"] rows = [] # 路径前加r前缀,避免Windows路径反斜杠触发转义错误 xmlparse = Xet.parse(r'E:\python\Tickets132.xml') root = xmlparse.getroot() # 逐一遍历每个工单节点 for ticket in root.findall('helpdesk-ticket'): # 提取当前工单的账号ID current_acc_id = ticket.find("account-id").text # 遍历当前工单下的所有备注 for note in ticket.findall('./notes/helpdesk-note'): note_text = note.find("body").text.strip() rows.append({ "account-id": current_acc_id, "notes" : note_text, }) df91 = pd.DataFrame(rows, columns=cols) print(df91) # 导出时加index=False,避免生成多余的索引列 df91.to_csv('output21.csv', index=False)
运行结果
执行代码后将得到符合预期的输出:
account-id notes 0 123 content 1 I need 1 123 content 2 I need 2 456 content 3 I need 3 456 content 4 I need
额外优化说明
- Windows本地文件路径前添加
r前缀,可避免路径中\t、\n等字符被识别为转义符,导致文件读取失败 - 对备注文本调用
.strip()方法,可自动清除示例文本中部分内容前后的冗余空格 - CSV导出时传入
index=False参数,不会把DataFrame自带的行序号作为单独一列存入文件
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

