python 在 xml 文件中编码'(引用)

标签 python xml encoding utf-8

我有一个未指定编码信息的 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>&#13;
 <source>Site name: Investigationâsaddress </source>&#13;
    <target/>&#13;
</unit>&#13;

为什么会出现这些额外的字符以及为什么 ' 无法正确显示。我尝试了 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/

相关文章:

java - Android Studio 应用程序 ImageView 拍照时不显示图像

oracle - Hibernate Oracle 和字符编码

python - 比较 Python 中的 C 指针

javascript - 是否可以使用代码来转换格式为 'list' : "translation"? 的列表

python - 列表循环不打印结果

java - XML 的注解 @JsonDeserialize 的等价物

python - 根据最终 excel 文件中特定列中的空/空白值删除一行 - Pandas Data frame

c++ - Xerces-C++ v2 和 v3 分支之间的差异

java - 按行分割文本文件,与平台无关

ajax - 解决使用ajax发送阿拉伯字符的问题