You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:45:31