基于XML的解决方案是为ElementTree编写一个helper类,该类:在解析为ElementTree之前在抓取XML声明行在写入时,如果不同时写入编码属性(我检查了源代码),则无法写入XML声明行。
解析输入文件一次,获取根元素的命名空间。向ElementTree注册该命名空间,将空字符串作为前缀。完成后,使用ElementTree再次使用该新设置分析源文件。
它有一个主要缺点:XML注释丢失。我了解到,对于这种情况,这是不可接受的(我最初认为输入数据没有任何注释,但事实证明它有)。
我的助手类示例:from xml.etree import ElementTree as ET
import re
class ElementTreeHelper():
def __init__(self, xml_file_name):
xml_file = open(xml_file_name, "rb")
self.__parse_xml_declaration(xml_file)
self.element_tree = ET.parse(xml_file)
xml_file.seek(0)
root_tag_namespace = self.__root_tag_namespace(self.element_tree)
self.namespace = None
if root_tag_namespace is not None:
self.namespace = '{' + root_tag_namespace + '}'
# Register the root tag