我有一个未指定编码信息的 xml 文件。我正在尝试使用以下方法读取它并在另一个位置写入文件
import xml.etree.ElementTree as ET
import pandas as pd
from lxml import etree,html
from lxml.html.clean import Cleaner,clean_html
from xml.sax.saxutils import escape, unescape, quoteattr
with open('check1.xml', 'rb') as file:
xml_file = file.read()
tree = html.fromstring(xml_file)
tree1 = etree.ElementTree(tree)
tree1.write('path to XML file', pretty_print=True, xml_declaration=True,encoding = 'utf-8')
输入:
<unit>
<source>Site name: Investigation's address</source>
<target></target>
</unit>
输出:
<unit>
<source>Site name: Investigationâsaddress </source>
<target/>
</unit>
为什么会出现这些额外的字符以及为什么 '
无法正确显示。我尝试了 latin-1 编码,但面临类似的问题,除了 '
不同的字符是显示。
最佳答案
不要使用open()
读取 XML 文件。这通常是错误的做法。
XML 解析器有自己的文件处理。 ElementTree
也不异常(exception)。使用ET.parse()
读取文件和 ET.write()
—或tree.write()
——写下它们。
import xml.etree.ElementTree as ET
tree = ET.parse('check1.xml')
tree.write('path to XML file', pretty_print=True, xml_declaration=True, encoding='utf-8')
这个简单的解析-写入循环还可以修复任何困惑的行结尾,因为 \r\n
is not a proper line ending in XML ;它总是会被转换为 \n
自动。
背景
几乎在所有情况下,XML 解析器中的文件处理函数都能正确处理文件编码。自己打开文件并将它们读入字符串会破坏这种自动处理,即手动执行此操作是一个等待发生的错误。
如果 XML 文件缺少 XML 声明 ( <?xml version="1.0" encoding="..." ?>
),则假定它是 UTF-8。如果这样的文件由于某种原因实际上不是 UTF-8,那么严格来说,它就已损坏。
支持 XML 的工具不会创建此类文件。如果您有此类文件,那么检查它们的创建方式并修复该过程应该是您的首要任务。
如果这不是一个选项,那么尝试修复这样一个损坏的文件是唯一的情况,将文件读入字符串并将该字符串提供给 XML 解析器将是正确的解决方案。然而,这需要事先了解文件编码,这正是您在使用 ET.parse()
时不需要担心的事情。 .
假设文件位于 Windows Code Page 1252 ,错误地错过了 XML 声明,并且您希望通过编写正确编码的版本来修复该问题:
import xml.etree.ElementTree as ET
with open('check1.xml', encoding="cp1252") as f:
tree = ET.fromstring(f.read())
tree.write('path to XML file', pretty_print=True, xml_declaration=True, encoding='utf-8')
除非您处于这种非常特殊的情况,否则请使用 ET.parse()
读取 XML 文件。
关于python 在 xml 文件中编码'(引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46171035/