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

使用Pandas读取Excel导出XML文件失败,求解决方案

解决Pandas读取Excel导出XML文件的问题

你遇到的核心问题是这个Excel导出的XML带有命名空间,直接用.//Cell这种XPath表达式找不到对应的节点,因为Pandas默认不会自动处理XML命名空间。下面是两种可行的解决方案:

方案一:指定命名空间读取

先定义XML中使用的命名空间映射,然后在read_xml里明确指定,同时调整XPath路径匹配带命名空间的节点:

import pandas as pd

# 定义XML里的命名空间,这里核心用到的是ss前缀对应的命名空间
namespaces = {"ss": "urn:schemas-microsoft-com:office:spreadsheet"}

# 读取表格中的所有行数据
df_raw = pd.read_xml(
    path,
    xpath="//ss:Worksheet/ss:Table/ss:Row",
    namespaces=namespaces
)

# 提取第一行作为表头
column_names = df_raw.iloc[0]["Cell"].apply(lambda cell: cell["Data"])

# 从第二行开始提取数据,整理成标准DataFrame格式
df_data = pd.DataFrame(
    df_raw.iloc[1:]["Cell"].tolist(),
    columns=column_names
)

# 取出每个单元格的实际数据值
df = df_data.applymap(lambda cell: cell["Data"])

方案二:先移除XML命名空间再读取

如果觉得处理命名空间麻烦,可以先用lxml库移除所有元素的命名空间,再交给Pandas读取:

import pandas as pd
from lxml import etree

# 读取XML并解析
tree = etree.parse(path)
root = tree.getroot()

# 遍历所有元素,移除命名空间前缀
for elem in root.iter():
    if '}' in elem.tag:
        elem.tag = elem.tag.split('}')[1]

# 将处理后的XML转为字符串
clean_xml = etree.tostring(root, encoding='unicode')

# 现在可以直接用简单的XPath读取行数据
df_raw = pd.read_xml(clean_xml, xpath=".//Row")

# 后续表头和数据处理和方案一一致
column_names = df_raw.iloc[0]["Cell"].apply(lambda cell: cell["Data"])
df_data = pd.DataFrame(
    df_raw.iloc[1:]["Cell"].tolist(),
    columns=column_names
)
df = df_data.applymap(lambda cell: cell["Data"])

为什么原来的代码失效?

这个XML里的所有核心元素(Worksheet、Table、Row、Cell、Data)都属于urn:schemas-microsoft-com:office:spreadsheet命名空间,不带命名空间的XPath表达式无法匹配到这些节点,必须通过上述两种方式处理命名空间后,才能正确解析出表格数据。

内容的提问来源于stack exchange,提问作者Volodymyr Ryzhuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:05:18