如何将含标签、属性与文本的XML解析为Pandas DataFrame?
解决方案:提取XML多层属性与文本到Pandas DataFrame
我来帮你搞定这个XML转DataFrame的问题!你之前的困扰应该是没法同时关联父节点(<ABR>)的属性和子节点(<ABN>)的信息对吧?下面是清晰的实现步骤和代码,你可以直接套用,之后扩展其他字段也很方便:
核心思路
每个<ABR>节点对应一条完整的数据记录,我们需要:
- 先提取
<ABR>自身的属性(recordLastUpdatedDate、replaced) - 再定位该节点下的
<ABN>子节点,提取它的属性(status、ABNStatusFromDate)和文本内容(ABN号码) - 把每条记录整理成字典,最后批量转换为DataFrame
完整代码示例
import xml.etree.ElementTree as et import pandas as pd # 解析XML文件 tree = et.parse('sample.xml') root = tree.getroot() # 初始化存储所有记录的列表 data_records = [] # 遍历每个ABR节点(每条数据的顶层容器) for abr_node in root.findall('ABR'): # 提取ABR节点的属性 abr_last_updated = abr_node.get('recordLastUpdatedDate') abr_replaced = abr_node.get('replaced') # 找到当前ABR下的ABN子节点 abn_node = abr_node.find('ABN') if abn_node is not None: # 提取ABN的属性和文本内容 abn_status = abn_node.get('status') abn_status_date = abn_node.get('ABNStatusFromDate') abn_number = abn_node.text.strip() if abn_node.text else None # 组装成单条记录的字典 single_record = { 'abr_record_last_updated_date': abr_last_updated, 'abr_replaced': abr_replaced, 'abn_status': abn_status, 'abn_status_from_date': abn_status_date, 'abn': abn_number } data_records.append(single_record) # 转换为结构化DataFrame df = pd.DataFrame(data_records) print(df)
代码细节说明
- 用
root.findall('ABR')直接定位所有数据节点,能确保父节点ABR的属性和子节点ABN的信息一一对应(之前你用root.iter('ABN')会拿到所有ABN节点,但没法直接关联上层ABR的属性) - 用
get()方法提取属性比直接访问attrib更灵活,属性不存在时会返回None,避免报错 - 处理ABN文本时加
strip()去除可能的空白字符,同时判断文本是否存在,增强鲁棒性
输出效果
运行代码后会得到你需要的结构化DataFrame:
abr_record_last_updated_date abr_replaced abn_status abn_status_from_date abn 0 20180216 N ACT 19991101 11000000948 1 20190531 N CAN 20190501 11000002568
你可以按照同样的逻辑,继续提取其他字段(比如EntityType、BusinessAddress等),只需要在遍历ABR节点时,继续查找对应的子节点并提取属性/文本即可。
内容的提问来源于stack exchange,提问作者Adam Williamson
相关产品推荐
相关产品推荐

