XML是一种常用的数据交换格式,在接口返回、配置文件、数据导出场景中经常出现,而Pandas的DataFrame是Python数据处理的核心结构,把XML转换成DataFrame是使用Pandas处理XML数据的基础操作。
基础方法:使用Pandas内置read_xml方法
Pandas从1.3.0版本开始提供了read_xml方法,可以直接读取XML文件并转换为DataFrame,适合结构规整的XML数据。首先确保你安装的Pandas版本符合要求,若版本过低可以通过pip install --upgrade pandas升级。
假设我们有一个名为data.xml的文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<id>1</id>
<name>张三</name>
<age>25</age>
</user>
<user>
<id>2</id>
<name>李四</name>
<age>28</age>
</user>
</users>
使用read_xml读取该文件的代码如下:
import pandas as pd
# 读取XML文件,指定xpath路径匹配user节点
df = pd.read_xml("data.xml", xpath="//user")
print(df)
运行后会输出如下DataFrame结果:
id name age 0 1 张三 25 1 2 李四 28
这里的xpath参数用于指定要提取的XML节点路径,如果XML结构更复杂,需要调整xpath表达式匹配到对应的数据节点。
复杂XML解析:结合xml.etree.ElementTree手动转换
如果XML结构不规则,或者需要自定义解析逻辑,可以使用Python内置的xml.etree.ElementTree模块先解析XML,再将解析结果组装成DataFrame。
还是以上面的data.xml为例,手动解析的实现步骤如下:
import xml.etree.ElementTree as ET
import pandas as pd
# 解析XML文件
tree = ET.parse("data.xml")
root = tree.getroot()
# 存储解析后的数据
data_list = []
# 遍历所有user节点
for user in root.findall("user"):
# 提取每个子节点的文本内容
user_id = user.find("id").text
user_name = user.find("name").text
user_age = user.find("age").text
# 将单条数据加入列表
data_list.append({
"id": user_id,
"name": user_name,
"age": user_age
})
# 转换为DataFrame
df = pd.DataFrame(data_list)
print(df)
这种方式的优势是可以灵活处理嵌套结构、属性值等复杂场景,比如如果XML的user节点带有属性,我们可以同时提取属性值:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user status="active">
<id>1</id>
<name>张三</name>
<age>25</age>
</user>
<user status="inactive">
<id>2</id>
<name>李四</name>
<age>28</age>
</user>
</users>
提取属性的代码调整如下:
import xml.etree.ElementTree as ET
import pandas as pd
tree = ET.parse("data.xml")
root = tree.getroot()
data_list = []
for user in root.findall("user"):
# 提取节点属性
status = user.get("status")
user_id = user.find("id").text
user_name = user.find("name").text
user_age = user.find("age").text
data_list.append({
"status": status,
"id": user_id,
"name": user_name,
"age": user_age
})
df = pd.DataFrame(data_list)
print(df)
两种方法的适用场景对比
我们可以通过下面的表格快速判断该选择哪种方法:
| 方法 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| Pandas read_xml | 结构规整、简单的XML数据 | 代码简洁,一行即可完成转换 | 复杂结构支持有限,依赖Pandas版本 |
| ElementTree手动解析 | 嵌套复杂、带属性、不规则XML数据 | 灵活度高,可自定义解析逻辑 | 代码量更多,需要手动处理节点遍历 |
常见问题说明
在使用read_xml方法时,如果遇到编码问题,可以在读取时指定编码参数:
df = pd.read_xml("data.xml", xpath="//user", encoding="utf-8")
如果XML数据不是文件而是字符串形式,可以直接传入字符串解析:
xml_str = """<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<id>1</id>
<name>张三</name>
<age>25</age>
</user>
</users>"""
df = pd.read_xml(xml_str, xpath="//user")
print(df)
手动解析时如果节点可能不存在,建议先判断节点是否为空,避免出现AttributeError:
age_node = user.find("age")
user_age = age_node.text if age_node is not None else None
PythonXMLDataFramePandasXML_to_DataFrame修改时间:2026-06-19 00:45:42