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

使用ElementTree转换XML至JSON时遭遇ParseError故障排查

问题根源与解决方法

为什么会报错?

你遇到的xml.etree.ElementTree.ParseError完全是因为文件名标错了——你以为input.xml是XML文件,但实际内容是JSON格式的。ElementTree是专门解析XML语法的库,根本识别不了JSON的大括号、键值对结构,自然会报格式错误,和编码处理、换文件无关(除非你换的是真正的XML文件)。

解决方法分两种情况:

  • 如果你的目标就是得到JSON文件:
    直接用Python自带的json模块处理这个文件就行,不需要XML解析的步骤。示例代码:

    import json
    
    # 读取伪装成xml的JSON文件
    with open('input.xml', 'r', encoding='utf-8') as f:
        json_data = json.load(f)
    
    # 输出为标准JSON文件(可选,也可以直接用读取到的数据)
    with open('output.json', 'w', encoding='utf-8') as f:
        json.dump(json_data, f, indent=4, ensure_ascii=False)
    
  • 如果你的真实需求是把XML转JSON,但拿错了文件:
    先找到真正的XML文件,再用ElementTree解析后转成JSON结构。这里给一个递归遍历XML元素转字典的示例:

    import xml.etree.ElementTree as ET
    import json
    
    def xml_to_dict(element):
        result = {}
        # 处理元素属性
        if element.attrib:
            result.update(element.attrib)
        # 遍历子元素
        for child in element:
            child_result = xml_to_dict(child)
            if child.tag in result:
                # 同一标签重复出现时转为列表
                if not isinstance(result[child.tag], list):
                    result[child.tag] = [result[child.tag]]
                result[child.tag].append(child_result)
            else:
                result[child.tag] = child_result
        # 处理元素文本内容
        if element.text and element.text.strip():
            if result:
                result['text'] = element.text.strip()
            else:
                result = element.text.strip()
        return result
    
    # 解析真实的XML文件
    tree = ET.parse('real_input.xml')
    root = tree.getroot()
    xml_dict = xml_to_dict(root)
    
    # 转换为JSON并输出
    with open('output.json', 'w', encoding='utf-8') as f:
        json.dump(xml_dict, f, indent=4, ensure_ascii=False)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:42:47