Python 3.6中为XML嵌套元素生成对应父节点KEY的实现方法
如何为XML转换后的DataFrame添加父节点信息?
我来帮你解决这个给XML元素添加父节点关联信息的问题!你已经完成了从API获取XML并转换为DataFrame的基础工作,现在只需要补充层级关系的跟踪逻辑就可以了。
问题核心分析
你当前的代码只是把所有XML元素的属性平铺收集到列表中,但没有记录元素之间的父子层级关系。要实现需求,我们需要在遍历XML节点时主动跟踪当前节点的父节点KEY,并将这个信息注入到每个元素的属性字典里。
修改后的完整代码
我调整了你的代码,加入了递归遍历逻辑来精准跟踪父节点:
import requests import xml.etree.ElementTree as ET import pandas as pd Dimension_Id = 'OBJ5263019' Language = '1033' Request_URL = 'http://dataportal.ins.tn/WebApi/GetDimensionElements' # 修正了原代码中转义字符的问题,直接使用XML标签格式 Method_Post_Body = "<QueryMessage lcid='" + Language + "'> <DataWhere> <DimensionId>" + Dimension_Id + "</DimensionId> </DataWhere> </QueryMessage>" Post_Response = requests.post(Request_URL, data=Method_Post_Body, headers={'Content-type': 'text/xml'}) XTree = Post_Response.content XRoot = ET.XML(XTree) XML_List = [] def traverse_xml(node, parent_key=""): """递归遍历XML节点,同步记录每个节点的父KEY""" # 仅处理带有KEY属性的Element节点(匹配你的需求描述) if 'KEY' in node.attrib: # 复制当前节点属性字典,新增Parent字段 element_data = node.attrib.copy() element_data['Parent'] = parent_key XML_List.append(element_data) # 递归遍历所有子节点,将当前节点的KEY作为子节点的父KEY传递 for child_node in node: traverse_xml(child_node, parent_key=node.attrib.get('KEY', "")) # 从你原代码指定的XRoot[1]节点开始遍历 traverse_xml(XRoot[1]) # 生成带父节点信息的最终DataFrame XML_Dimension_Items = pd.DataFrame(XML_List)
关键逻辑说明
- 递归遍历函数
traverse_xml:- 接收两个参数:当前遍历的XML节点,以及该节点的父节点KEY(默认空字符串,对应顶级节点)
- 先检查当前节点是否包含
KEY属性,符合条件就复制属性字典并添加Parent字段后存入列表 - 再递归遍历所有子节点,把当前节点的
KEY作为子节点的父KEY传递下去
- 启动遍历:和你原代码保持一致,从
XRoot[1]开始,确保数据源范围完全匹配 - 最终效果:生成的DataFrame会新增
Parent列,顶级元素的Parent为空字符串,子元素的Parent严格对应其父节点的KEY值
验证方式
你可以通过print(XML_Dimension_Items[['KEY', 'Parent']].head(10))快速查看结果,确认父子节点的关联关系是否符合预期。
内容的提问来源于stack exchange,提问作者question.it
相关产品推荐
相关产品推荐

