在python中使用etree&LXML解析开头带有编码块的XML字符串

2024-03-29 00:12:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须解析这样开始的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片段


Tags: 文件字符串importfalse声明parserstringversion
1条回答
网友
1楼 · 发布于 2024-03-29 00:12:53

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

一些XML解析器在解析字符串时会自动忽略这些信息。有些人会犯错误

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

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

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

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

相关问题 更多 >