使用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
相关产品推荐
相关产品推荐

