如何将指定结构的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
相关产品推荐
相关产品推荐

