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

求无需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')

额外注意事项

  1. 替换命名空间:把代码里的http://test.test换成你XML根节点实际的xmlns属性值
  2. 安装依赖:运行前执行pip install pandas openpyxl确保依赖齐全
  3. 数据校验:运行后可先打印print(df.head()),对比原XML的前几条数据,确认字段和日期是否匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:12:52