求无需PHP及Excel导入功能的XML转Excel脚本及Python代码排查
XML转Excel纯Python方案(无需PHP/Excel导入)
针对你代码导出数据和原XML不一致的问题,梳理下问题点和修正方案:
你的代码存在的核心问题
- 导入语句格式错误:两行导入写在同一行,Python会直接报错,必须拆分
- 函数调用不匹配:最后调用的
convert_test_xml_to_csv和定义的convert_green_button_xml_to_csv名称不一致,运行时会提示函数未定义 - 节点查找无容错:如果XML中某个
IntervalReading下的子节点缺失,find返回None后调用.text会直接崩溃,导致数据截断 - 日期转换逻辑错误:你默认
start是秒级时间戳,但原XML的start大概率是ISO8601格式字符串(比如2024-05-20T12:00:00Z),强行按秒转换会导致日期完全失真,这是数据不一致的主要原因
修正后的完整代码
import xml.etree.ElementTree as ET import pandas as pd # 统一定义命名空间,避免重复编写 NS = {'gb': 'http://test.test'} def parse_interval_reading(reading): # 用命名空间查找节点,增加容错处理,节点不存在时返回空字符串 duration = reading.find('.//gb:timePeriod/gb:duration', NS) start = reading.find('.//gb:timePeriod/gb:start', NS) value = reading.find('.//gb:value', NS) return { 'duration': duration.text.strip() if duration is not None else '', 'start': start.text.strip() if start is not None else '', 'value': value.text.strip() if value is not None else '', } def green_button_xml_to_df(xml_file): tree = ET.parse(xml_file) root = tree.getroot() # 通过命名空间定位所有IntervalReading节点 readings = root.findall('.//gb:IntervalReading', NS) data = [parse_interval_reading(reading) for reading in readings] df = pd.DataFrame(data) # 优先按ISO8601格式解析日期,失败再尝试秒级时间戳,解析失败的保留原始值 try: df['start'] = pd.to_datetime(df['start'], format='ISO8601', errors='coerce') except ValueError: df['start'] = pd.to_datetime(df['start'], unit='s', errors='coerce') return df def convert_green_button_xml_to_csv(xml_file, csv_file): df = green_button_xml_to_df(xml_file) df.to_csv(csv_file, index=False) def convert_green_button_xml_to_excel(xml_file, excel_file): df = green_button_xml_to_df(xml_file) # 需提前安装openpyxl:pip install openpyxl df.to_excel(excel_file, index=False, engine='openpyxl') # 修正函数调用名称,与定义的函数名一致 convert_green_button_xml_to_csv('/Users/dummyname/Downloads/test.xml', '/Users/dummyname/output.csv') # 若需导出Excel,取消注释下方代码 # convert_green_button_xml_to_excel('/Users/dummyname/Downloads/test.xml', '/Users/dummyname/output.xlsx')
额外注意事项
- 替换命名空间:把代码里的
http://test.test换成你XML根节点实际的xmlns属性值 - 安装依赖:运行前执行
pip install pandas openpyxl确保依赖齐全 - 数据校验:运行后可先打印
print(df.head()),对比原XML的前几条数据,确认字段和日期是否匹配
内容的提问来源于stack exchange,提问作者stitch70
相关产品推荐
相关产品推荐

