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

如何将指定结构的XML文件导入至Pandas DataFrame?

将指定结构的XML导入Pandas的正确方法

你需要导入的XML结构如下:

<ROOT>
    <data>
        <record>
            <field name="Country or Area">Afghanistan</field>
            <field name="Year">2020</field>
            <field name="Item">Gross Domestic Product (GDP)</field>
            <field name="Value">508.453721937094</field>
        </record>
        <record>
            <field name="Country or Area">Afghanistan</field>
            <field name="Year">2019</field>
            <field name="Item">Gross Domestic Product (GDP)</field>
            <field name="Value">496.940552822825</field>
        </record>
    </data>
</ROOT>

你尝试的代码如下:

from lxml import objectify

xml = objectify.parse('GDP_pc.xml')
root = xml.getroot()

data=[]
for i in range(len(root.getchildren())):
    data.append([child.text for child in root.getchildren()[i].getchildren()])

df = pd.DataFrame(data)
df.columns = ['Country or Area', 'Year', 'Item', 'Value',]

问题分析

原代码依赖节点索引和固定顺序,一旦XML中字段顺序变动就会导致列名对应错误,而且getchildren()方法在lxml新版本中已被弃用,灵活性不足。

解决方案

方法一:用lxml构建字典列表(兼容所有版本)

通过解析每个field节点的name属性和文本内容,构建字典后转成DataFrame,无需依赖字段顺序:

from lxml import objectify
import pandas as pd

xml = objectify.parse('GDP_pc.xml')
root = xml.getroot()

records = []
# 遍历所有record节点
for record in root.data.record:
    row_dict = {}
    for field in record.iterchildren():
        row_dict[field.attrib['name']] = field.text
    records.append(row_dict)

df = pd.DataFrame(records)

方法二:用Pandas自带的read_xml(Pandas 1.3.0+)

如果你的Pandas版本足够新,直接用read_xml指定XPath即可一键导入,代码更简洁:

import pandas as pd

# 直接定位到所有record节点,自动解析field的name作为列名
df = pd.read_xml('GDP_pc.xml', xpath='//record')

内容的提问来源于stack exchange,提问作者Giovanni Martinez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:11:09