如何用Python的xml.etree.ElementTree覆盖XML文件中的空编码值?
解决XML声明编码为空导致的解析错误
你的问题核心是XML声明里的encoding=""不符合XML语法规范,所以即使指定XMLParser的编码也没用——解析器在读取编码参数前就会因为无效的XML声明报错。以下是两种可行的解决方法:
方法一:预处理文件内容,修复XML声明
先手动读取文件内容,把空的encoding替换成有效的编码值(比如UTF-8),再用fromstring解析:
import xml.etree.ElementTree as et file_name = "your_file.xml" # 读取文件内容 with open(file_name, "r", encoding="utf-8") as f: content = f.read() # 替换空的encoding属性 fixed_content = content.replace('encoding=""', 'encoding="UTF-8"') # 解析修复后的内容 root = et.fromstring(fixed_content) # 验证结果 print(root.find("Field1").text) # 输出7933
方法二:使用xml.sax解析器绕过XML声明检查
如果不想修改文件内容,可以用xml.sax的解析器,它对不规范的XML声明容忍度更高,再转换为ElementTree的元素:
import xml.etree.ElementTree as et from xml.sax import make_parser from xml.sax.handler import ContentHandler class SaxToElement(ContentHandler): def __init__(self): self.root = None self.current_element = None self.element_stack = [] def startElement(self, name, attrs): elem = et.Element(name, attrs) if self.root is None: self.root = elem if self.current_element is not None: self.current_element.append(elem) self.element_stack.append(elem) self.current_element = elem def endElement(self, name): self.element_stack.pop() self.current_element = self.element_stack[-1] if self.element_stack else None def characters(self, content): if content.strip(): if self.current_element.text is None: self.current_element.text = content.strip() # 初始化SAX解析器 parser = make_parser() handler = SaxToElement() parser.setContentHandler(handler) # 解析文件 with open(file_name, "r", encoding="utf-8") as f: parser.parse(f) # 获取根元素 root = handler.root print(root.find("Field3").text) # 输出Montana
补充说明
xml.etree.ElementTree的默认解析器对XML语法的严格性要求较高,这种空encoding的声明属于无效语法,所以会直接报错。- 预处理文件的方法更简单直接,适合大多数场景;SAX解析的方法适合无法修改原文件的情况。
内容的提问来源于stack exchange,提问作者lawrence
相关产品推荐
相关产品推荐

