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

Python下ISO-8859-1编码XML转UTF-8及解析问题求助

解决ISO-8859-1编码XML转UTF-8并解析的问题

核心思路

无需手动转码后再解析,直接利用xml.etree.ElementTree的解析能力指定原编码,解析完成后直接以UTF-8编码写入新文件,同时修正XML声明的编码信息。

单个文件处理代码

from xml.etree import ElementTree as ET

# 输入输出文件路径
input_file = "StackOverflow.xml"
output_file = "StackOverflow_utf8.xml"

# 1. 解析ISO-8859-1编码的XML文件
# 指定parser的encoding参数,确保正确读取特殊字符
tree = ET.parse(input_file, parser=ET.XMLParser(encoding="iso-8859-1"))
root = tree.getroot()

# 2. 将解析后的XML以UTF-8编码写入新文件
# xml_declaration=True会自动生成<?xml version='1.0' encoding='utf-8'?>声明
tree.write(
    output_file,
    encoding="utf-8",
    xml_declaration=True,
    method="xml"
)

# 可选:验证解析结果,打印参数值
for module in root.findall("Module"):
    param_value = module.find("Parameter").attrib.get("Value")
    print(f"解析到参数值: {param_value}")

批量处理大量XML文件

如果需要处理目录下所有XML文件,可使用以下代码:

from xml.etree import ElementTree as ET
import os

# 输入输出目录
input_dir = "path/to/your/xml_source"
output_dir = "path/to/utf8_converted"

# 创建输出目录(如果不存在)
os.makedirs(output_dir, exist_ok=True)

# 遍历目录下所有XML文件
for filename in os.listdir(input_dir):
    if filename.lower().endswith(".xml"):
        input_path = os.path.join(input_dir, filename)
        output_path = os.path.join(output_dir, filename)
        
        try:
            # 解析原编码XML
            tree = ET.parse(input_path, parser=ET.XMLParser(encoding="iso-8859-1"))
            # 写入UTF-8编码文件
            tree.write(output_path, encoding="utf-8", xml_declaration=True, method="xml")
            print(f"已完成转换: {filename}")
        except Exception as e:
            print(f"转换失败 {filename}: {str(e)}")

你之前代码的问题说明

  • 存在变量错误:target.write应为f.write,导致无法写入文件
  • 手动转码后再解析的逻辑有误:直接修改文件编码会破坏XML结构的编码兼容性,导致解析失败
  • 模块导入混乱:部分代码使用etree.XMLParser但未正确导入对应模块(你明确说明不能用lxml)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:32:36