使用lxml处理XML数据:单文件代码报错与批量处理需求
问题修复与XML批量数据提取实现
一、单文件代码错误修复
原代码存在三个核心错误:
- 文件名列表错误调用encode:
serial是包含文件名的列表,不能直接调用encode,需先读取文件内容。 - XPath节点名大小写不匹配:XML根节点为
<reixmlPrenos>,原代码写为reiXmlPrenos,导致无法定位节点。 - XPath元素提取方式错误:
A和z是XML子元素而非节点属性,不能用./@A,需用./A/text()提取元素文本。
修复后的单文件运行代码:
from lxml import etree import pandas as pd filename = "S1.xml" # 读取目标文件内容 with open(filename, 'r', encoding='utf-8') as f: content = f.read() doc = etree.XML(content.encode('utf-8')) # 准确定位根节点并提取目标字段 root = doc.xpath('/reixmlPrenos')[0] a_val = float(root.xpath("./A/text()")[0]) z_val = float(root.xpath("./z/text()")[0]) # 生成符合要求的DataFrame df = pd.DataFrame({'A': [a_val], 'z': [z_val]}, index=[filename]) print(df)
二、批量处理同目录所有XML文件
使用glob模块遍历当前目录下所有.xml文件,循环提取数据并合并为单个DataFrame:
from lxml import etree import pandas as pd import glob # 初始化数据存储容器 data_records = [] file_names = [] # 遍历所有xml文件 for file_path in glob.glob("*.xml"): # 读取并解析xml文件 with open(file_path, 'r', encoding='utf-8') as f: xml_content = f.read() xml_doc = etree.XML(xml_content.encode('utf-8')) # 提取目标字段并转换为数值类型 root_node = xml_doc.xpath('/reixmlPrenos')[0] a_value = float(root_node.xpath("./A/text()")[0]) z_value = float(root_node.xpath("./z/text()")[0]) # 存储单文件数据与文件名 data_records.append({'A': a_value, 'z': z_value}) file_names.append(file_path) # 合并生成最终DataFrame final_df = pd.DataFrame(data_records, index=file_names) # 可选:按文件名排序 final_df = final_df.sort_index() print(final_df)
三、关键说明
glob.glob("*.xml"):快速获取当前目录下所有XML文件的路径- 字段转换为
float类型:确保后续可进行数值计算或统计分析 - 文件名作为索引:完全匹配你期望的输出格式
内容的提问来源于stack exchange,提问作者energyMax
相关产品推荐
相关产品推荐

