Python中无稳定版pandas.read_xml()函数,需用xml.etree.ElementTree或lxml解析XML再构DataFrame;关键在于按XML树状结构提取属性与子元素,手动构建字典列表或借助lxml增强的read_xml()实验接口。

Python中没有pandas原生的read_xml()函数(截至pandas 2.0+仍属实验性,不推荐生产环境直接依赖),但可以通过标准库xml.etree.ElementTree或第三方库lxml解析XML,再构造DataFrame。关键在于理解XML结构,并将其映射为二维表格逻辑。
先看XML结构,再决定怎么转
XML不是表格格式,它可能是嵌套、属性混合、重复节点并存的树状结构。强行“一键转DataFrame”容易出错。例如:
Python Crash Course Eric Matthes 39.99 Fluent Python Luciano Ramalho 49.99
这个例子中:每本是1行;id是属性;和是子元素;既有文本值又有currency属性——你需要明确哪些信息要进列。
用ElementTree手动解析(轻量、无需额外安装)
适合结构清晰、层级较浅的XML。步骤:加载 → 找到所有记录节点 → 提取字段 → 构建字典列表 → 转DataFrame。
立即学习“Python免费学习笔记(深入)”;
- 导入
xml.etree.ElementTree as ET和pandas - 用
ET.parse("file.xml")或ET.fromstring(xml_str)加载 - 用
root.findall(".//book")定位每一行数据节点(XPath支持有限,但够用) - 对每个
book节点:
– 用book.get("id")取属性
– 用book.find("title").text取子元素文本
– 用book.find("price").text和book.find("price").get("currency")分别取值和属性 - 把每次提取的结果append进list,最后
pd.DataFrame(list_of_dicts)
用lxml + pandas.read_xml(仅限pandas ≥ 1.4,需lxml支持)
如果你的XML是扁平的、每条记录同级且标签名一致(如上面的),可以尝试pandas内置实验接口:
- 安装依赖:
pip install lxml(xml.etree不支持XPath 2.0,lxml更强大) - 调用:
pd.read_xml("books.xml", xpath=".//book") - 支持参数:
attrs_only=True只读属性;names=["id", "title", "author"]重命名列;iterparse=True处理大文件(逐块解析) - 注意:
read_xml()默认忽略属性,若要保留,得配合stylesheet(XSLT)或先用lxml预处理
处理常见坑点
空值/缺失子节点:用find()可能返回None,直接调.text会报错 → 改用find("xxx") is not None and find("xxx").text,或封装安全取值函数。
命名空间(ns):XML带xmlns="http://..."时,XPath必须声明前缀,例如root.findall(".//ns:book", namespaces={"ns": "http://..."})。
大文件内存溢出:别用ET.parse()全量加载,改用ET.iterparse()边读边处理,或用lxml.etree.iterparse()设events=("start", "end")流式解析。










