【问题标题】:parsing XML string with encoding block at the beginning in python with etree & LXML [duplicate]使用etree和LXML在python开头解析带有编码块的XML字符串[重复]
【发布时间】:2021-04-29 23:32:44
【问题描述】:

我必须解析这样开头的 XML 文件:

xml_string = '''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <annotationStandOffs xmlns="http://www.tei-c.org/ns/1.0">
        <standOff> 
    ...
</standOff> 
</annotationStandOffs>
    '''

只有当我消除上面显示的字符串的第一行时,以下代码才会生效:

import xml.etree.ElementTree as ET
from lxml import etree
parser = etree.XMLParser(resolve_entities=False,strip_cdata=False,recover=True)
    
XML_tree = etree.XML(xml_string,parser=parser)

否则会报错:

ValueError:不支持带有编码声明的 Unicode 字符串。请使用不带声明的字节输入或 XML 片段。

【问题讨论】:

  • 试试XML_tree = etree.XML(xml_string.encode('utf-8'),parser=parser)

标签: python xml xml.etree


【解决方案1】:

如错误所示,XML 声明的encoding 部分旨在提供有关如何将字节(例如从文件中读取)转换为字符串的必要信息。当 XML 已经是一个字符串时,它没有意义。

一些 XML 解析器在解析字符串时会默默地忽略此信息。有些会抛出错误。

因此,由于您将 XML 粘贴到 Python 源代码中的字符串文字中,因此只有在编辑 Python 文件时自己删除声明才有意义。

另一个不太聪明的选择是使用字节字符串文字b'''...''',或者在运行时将字符串编码为单字节编码'''...'''.encode('windows-1252')。但这打开了另一个蠕虫罐头。当您的 Python 文件编码(例如 UTF-8)与您复制粘贴的 XML(例如 UTF-16)中所谓的 XML 编码发生冲突时,您会得到更多有趣的错误。

长话短说,不要那样做。 不要在未删除 XML 声明的情况下将 XML 复制粘贴到 Python 源代码中。并且不要试图通过运行时字符串encode()tomfoolery 来“修复”它。

反之亦然。如果您有 bytes(例如,以二进制模式从文件中读取,或从网络套接字中读取),则将这些字节提供给 XML 解析器。不要先手动将decode()它们转换成字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 2015-06-26
    • 2020-08-28
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多