如何将单条XML字符串解析为Pandas DataFrame?
问题描述
我有一个包含在myData标签内的XML字符串(实际包含10000+元素,示例如下),注意示例XML存在语法错误(子元素缺少标签名):
<myData> <x1="A" name="P1" supp="TU01" type="CA" date="200607" proc="Y" iden="1" /> <x1="B" name="Q1" supp="TU01" type="CA" date="200609" proc="N" iden="5" /> <x1="B" name="R1" supp="UY7" type="CA" date="200609" proc="N" iden="12" /> </myData>
目标是将该XML解析为包含x1、name、supp、type、date、proc、iden列的Pandas DataFrame,预期输出如下:
x1 name supp type date proc iden 0 A P1 TU01 CA 200607 Y 1 1 B Q1 TU01 CA 200609 N 5 2 B R1 UY7 CA 200609 N 12
尝试用xml.etree.ElementTree解析时,仅获取到3个元素的x1信息,后续用字典构建DataFrame也失败,代码如下:
from xml.etree import ElementTree as ET root = ET.fromstring(myxml) print(root) for child in root.iter('*'): print(child.tag)
xmlDict = {} for parent in root: child = parent.getchildren() xmlDict[child[0].text] = child[1].text
解决方案
1. 修正XML语法
原示例XML的子元素缺少标签名(如<x1="A".../>是无效XML),需给每个子元素添加标签名(比如record),否则无法正常解析。
2. 正确解析代码
所有目标数据都存储在子元素的属性中,而非子元素节点,因此直接提取每个子元素的属性字典即可:
from xml.etree import ElementTree as ET import pandas as pd # 修正后的XML(实际使用时替换为你的有效XML字符串) myxml = ''' <myData> <record x1="A" name="P1" supp="TU01" type="CA" date="200607" proc="Y" iden="1" /> <record x1="B" name="Q1" supp="TU01" type="CA" date="200609" proc="N" iden="5" /> <record x1="B" name="R1" supp="UY7" type="CA" date="200609" proc="N" iden="12" /> </myData> ''' # 解析XML root = ET.fromstring(myxml) # 收集每个子元素的属性字典 data_rows = [] for elem in root: data_rows.append(elem.attrib) # 转换为DataFrame并调整列顺序 df = pd.DataFrame(data_rows)[['x1', 'name', 'supp', 'type', 'date', 'proc', 'iden']] print(df)
错误原因说明
- 原XML语法不合法,子元素无标签名,导致解析逻辑混乱
- 之前的代码误用
getchildren(),但目标数据都在元素属性里,子元素节点为空,因此无法获取有效数据 root.iter('*')遍历的是XML元素标签,而非属性名,所以只能看到myData和子元素的标签名(如修正后的record)
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

