xml.parsers.expat — 使用 Expat 进行快速 XML 解析


警告

pyexpat 模块对于恶意构造的数据不安全。 如果您需要解析不受信任或未经身份验证的数据,请参阅XML 漏洞

xml.parsers.expat 模块是 Python 中 Expat 非验证 XML 解析器的接口。 该模块提供了一个扩展类型 xmlparser,它表示 XML 解析器的当前状态。创建 xmlparser 对象后,可以将该对象的各种属性设置为处理函数。然后,当将 XML 文档提供给解析器时,将为 XML 文档中的字符数据和标记调用处理函数。

此模块使用 pyexpat 模块来提供对 Expat 解析器的访问。不推荐直接使用 pyexpat 模块。

此模块提供一个异常和一个类型对象

exception xml.parsers.expat.ExpatError

当 Expat 报告错误时引发的异常。 有关解释 Expat 错误的更多信息,请参阅 ExpatError 异常 部分。

exception xml.parsers.expat.error

的别名 ExpatError

xml.parsers.expat.XMLParserType

的返回值类型 ParserCreate() 函数。

xml.parsers.expat 模块包含两个函数

xml.parsers.expat.ErrorString(errno)

返回给定错误号 *errno* 的解释性字符串。

xml.parsers.expat.ParserCreate(encoding=None, namespace_separator=None)

创建并返回一个新的 xmlparser 对象。 *encoding*(如果指定)必须是一个字符串,用于命名 XML 数据使用的编码。 Expat 不支持 Python 支持的那么多编码,并且其编码库无法扩展;它支持 UTF-8、UTF-16、ISO-8859-1 (Latin1) 和 ASCII。 如果指定了 *encoding* [1],它将覆盖文档的隐式或显式编码。

Expat 可以选择为您执行 XML 命名空间处理,方法是为 *namespace_separator* 提供一个值。 该值必须是单字符字符串;如果字符串的长度不合法,将引发 ValueErrorNone 被视为省略)。 启用命名空间处理后,将扩展属于命名空间的元素类型名称和属性名称。 传递给元素处理程序 StartElementHandlerEndElementHandler 的元素名称将是命名空间 URI、命名空间分隔符字符和名称的本地部分的串联。如果命名空间分隔符是零字节 (chr(0)),则命名空间 URI 和本地部分将串联在一起,而没有任何分隔符。

例如,如果 *namespace_separator* 设置为空格字符 (' ') 并且解析了以下文档

<?xml version="1.0"?>
<root xmlns    = "http://default-namespace.org/"
      xmlns:py = "https://pythonlang.cn/ns/">
  <py:elem1 />
  <elem2 xmlns="" />
</root>

StartElementHandler 将接收每个元素的以下字符串

http://default-namespace.org/ root
http://www.python.org/ns/ elem1
elem2

由于 pyexpat 使用的 Expat 库的限制,返回的 xmlparser 实例只能用于解析单个 XML 文档。 为每个文档调用 ParserCreate 以提供唯一的解析器实例。

另请参阅

Expat XML 解析器

Expat 项目的主页。

XMLParser 对象

xmlparser 对象具有以下方法

xmlparser.Parse(data[, isfinal])

解析字符串 *data* 的内容,调用适当的处理函数来处理已解析的数据。 *isfinal* 必须在最后一次调用此方法时为 true;它允许以片段形式解析单个文件,而不是提交多个文件。 *data* 可以随时为空字符串。

xmlparser.ParseFile(file)

解析从对象 *file* 读取的 XML 数据。 *file* 只需要提供 read(nbytes) 方法,当没有更多数据时返回空字符串。

xmlparser.SetBase(base)

设置基础,用于解析声明中系统标识符中的相对 URI。 解析相对标识符留给应用程序:此值将作为 *base* 参数传递给 ExternalEntityRefHandler()NotationDeclHandler()UnparsedEntityDeclHandler() 函数。

xmlparser.GetBase()

返回一个字符串,其中包含先前调用 SetBase() 设置的基础值,如果尚未调用 SetBase(),则返回 None

xmlparser.GetInputContext()

以字符串形式返回生成当前事件的输入数据。数据采用包含文本的实体的编码。当在事件处理程序未处于活动状态时调用时,返回值是 None

xmlparser.ExternalEntityParserCreate(context[, encoding])

创建一个“子”解析器,该解析器可用于解析父解析器解析的内容引用的外部已解析实体。context 参数应该是传递给 ExternalEntityRefHandler() 处理函数(如下所述)的字符串。创建子解析器时,ordered_attributesspecified_attributes 设置为该解析器的值。

xmlparser.SetParamEntityParsing(flag)

控制参数实体(包括外部 DTD 子集)的解析。可能的 flag 值是 XML_PARAM_ENTITY_PARSING_NEVERXML_PARAM_ENTITY_PARSING_UNLESS_STANDALONEXML_PARAM_ENTITY_PARSING_ALWAYS。如果设置标志成功,则返回 true。

xmlparser.UseForeignDTD([flag])

如果使用 true 值(默认值)调用此方法,Expat 将使用 None 作为所有参数来调用 ExternalEntityRefHandler,以便加载备用 DTD。如果文档不包含文档类型声明,则仍将调用 ExternalEntityRefHandler,但不会调用 StartDoctypeDeclHandlerEndDoctypeDeclHandler

flag 传递 false 值将取消先前传递 true 值的调用,但除此之外没有其他作用。

此方法只能在调用 Parse()ParseFile() 方法之前调用;在调用其中任何一个方法之后调用它会导致引发 ExpatError,且 code 属性设置为 errors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]

xmlparser.SetReparseDeferralEnabled(enabled)

警告

调用 SetReparseDeferralEnabled(False) 具有安全隐患,如下文详述;请务必在执行 SetReparseDeferralEnabled 方法之前了解这些后果。

Expat 2.6.0 引入了一种名为“重新解析延迟”的安全机制,其中不再因重新解析大型标记导致二次运行时的拒绝服务,而是默认延迟重新解析未完成的标记,直到达到足够的输入量。由于此延迟,注册的处理程序可能(取决于推送到 Expat 的输入块的大小)在将新输入推送到解析器后不再立即调用。如果需要立即反馈并承担防止大型标记导致拒绝服务的责任,则调用 SetReparseDeferralEnabled(False) 会暂时或完全禁用当前 Expat 解析器实例的重新解析延迟。调用 SetReparseDeferralEnabled(True) 允许重新启用重新解析延迟。

请注意,SetReparseDeferralEnabled() 已作为安全修复程序反向移植到某些先前的 CPython 版本。如果在跨多个 Python 版本运行的代码中使用,请使用 hasattr() 检查 SetReparseDeferralEnabled() 的可用性。

在版本 3.13 中新增。

xmlparser.GetReparseDeferralEnabled()

返回给定 Expat 解析器实例当前是否启用了重新解析延迟。

在版本 3.13 中新增。

xmlparser 对象具有以下属性

xmlparser.buffer_size

buffer_text 为 true 时使用的缓冲区大小。可以通过为此属性分配新的整数值来设置新的缓冲区大小。当大小更改时,缓冲区将被刷新。

xmlparser.buffer_text

将其设置为 true 会导致 xmlparser 对象缓冲 Expat 返回的文本内容,以尽可能避免多次调用 CharacterDataHandler() 回调。这可以大大提高性能,因为 Expat 通常会在每个行尾将字符数据分成块。默认情况下,此属性为 false,并且可以随时更改。请注意,当它为 false 时,不包含换行符的数据也可能被分块。

xmlparser.buffer_used

如果启用了 buffer_text,则为缓冲区中存储的字节数。这些字节表示 UTF-8 编码的文本。当 buffer_text 为 false 时,此属性没有实际意义。

xmlparser.ordered_attributes

将此属性设置为非零整数会导致属性作为列表而不是字典报告。属性以在文档文本中找到的顺序呈现。对于每个属性,会显示两个列表项:属性名称和属性值。(此模块的早期版本也使用此格式。)默认情况下,此属性为 false;可以随时更改。

xmlparser.specified_attributes

如果设置为非零整数,解析器将仅报告文档实例中指定的属性,而不是那些从属性声明派生的属性。设置此项的应用程序需要特别注意使用声明中提供的其他信息,以符合 XML 处理器行为的标准。默认情况下,此属性为 false;可以随时更改。

以下属性包含与 xmlparser 对象遇到的最近错误相关的值,并且只有在调用 Parse()ParseFile() 引发 xml.parsers.expat.ExpatError 异常后才具有正确的值。

xmlparser.ErrorByteIndex

发生错误的字节索引。

xmlparser.ErrorCode

指定问题的数字代码。此值可以传递给 ErrorString() 函数,或与 errors 对象中定义的常量进行比较。

xmlparser.ErrorColumnNumber

发生错误的列号。

xmlparser.ErrorLineNumber

发生错误的行号。

以下属性包含与 xmlparser 对象中当前解析位置相关的值。在报告解析事件的回调期间,它们指示生成事件的字符序列的第一个字符的位置。当在回调之外调用时,指示的位置将刚好在最后一个解析事件之后(无论是否存在关联的回调)。

xmlparser.CurrentByteIndex

解析器输入中的当前字节索引。

xmlparser.CurrentColumnNumber

解析器输入中的当前列号。

xmlparser.CurrentLineNumber

解析器输入中的当前行号。

以下是可以设置的处理程序列表。要在 xmlparser 对象 *o* 上设置处理程序,请使用 o.handlername = func。 *handlername* 必须从以下列表中选取,而 *func* 必须是接受正确数量参数的可调用对象。除非另有说明,否则参数均为字符串。

xmlparser.XmlDeclHandler(version, encoding, standalone)

当解析 XML 声明时调用。XML 声明是 XML 建议的适用版本、文档文本的编码以及可选的“独立”声明的(可选)声明。*version* 和 *encoding* 将是字符串,如果文档声明为独立文档,则 *standalone* 将为 1;如果声明为非独立文档,则为 0;如果省略了独立子句,则为 -1。这仅适用于 Expat 1.95.0 或更高版本。

xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)

当 Expat 开始解析文档类型声明时调用(<!DOCTYPE ...)。*doctypeName* 按原样提供。如果指定了系统标识符和公共标识符,则 *systemId* 和 *publicId* 参数会给出它们的值;如果省略了,则为 None。如果文档包含内部文档声明子集,则 *has_internal_subset* 将为 true。这需要 Expat 1.2 或更高版本。

xmlparser.EndDoctypeDeclHandler()

当 Expat 完成解析文档类型声明时调用。这需要 Expat 1.2 或更高版本。

xmlparser.ElementDeclHandler(name, model)

为每个元素类型声明调用一次。*name* 是元素类型的名称,*model* 是内容模型的表示形式。

xmlparser.AttlistDeclHandler(elname, attname, type, default, required)

为元素类型的每个声明的属性调用。如果属性列表声明声明了三个属性,则此处理程序将被调用三次,每次调用一个属性。*elname* 是声明所应用的元素的名称,而 *attname* 是声明的属性的名称。属性类型是以字符串形式传递的 *type*;可能的值为 'CDATA''ID''IDREF' 等。如果属性未由文档实例指定,则 *default* 给出属性的默认值;如果没有默认值(#IMPLIED 值),则为 None。如果属性需要在文档实例中给出,则 *required* 将为 true。这需要 Expat 1.95.0 或更高版本。

xmlparser.StartElementHandler(name, attributes)

为每个元素的开头调用。*name* 是包含元素名称的字符串,而 *attributes* 是元素属性。如果 ordered_attributes 为 true,则这是一个列表(有关完整说明,请参见 ordered_attributes)。否则,它是将名称映射到值的字典。

xmlparser.EndElementHandler(name)

为每个元素的结尾调用。

xmlparser.ProcessingInstructionHandler(target, data)

为每个处理指令调用。

xmlparser.CharacterDataHandler(data)

调用以处理字符数据。这将针对普通字符数据、CDATA 标记的内容和可忽略的空白符进行调用。必须区分这些情况的应用程序可以使用 StartCdataSectionHandlerEndCdataSectionHandlerElementDeclHandler 回调来收集所需的信息。请注意,即使字符数据很短,也可能会被分块,因此您可能会多次收到对 CharacterDataHandler() 的调用。将 buffer_text 实例属性设置为 True 可以避免这种情况。

xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)

针对未解析的 (NDATA) 实体声明调用。这仅适用于 Expat 库的 1.2 版本;对于更新的版本,请改用 EntityDeclHandler。(Expat 库中的底层函数已被声明为已过时。)

xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)

针对所有实体声明调用。对于参数实体和内部实体,value 将是一个字符串,给出实体的声明内容;对于外部实体,这将是 None。对于已解析的实体,notationName 参数将是 None,对于未解析的实体,则是表示法的名称。如果实体是参数实体,则 is_parameter_entity 将为 true,对于一般实体则为 false(大多数应用程序只需要关注一般实体)。这仅在 Expat 库的 1.95.0 版本或更高版本中可用。

xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)

针对表示法声明调用。如果给定 notationNamebasesystemIdpublicId,则它们是字符串。如果省略了公共标识符,则 publicId 将为 None

xmlparser.StartNamespaceDeclHandler(prefix, uri)

当元素包含命名空间声明时调用。命名空间声明在为放置声明的元素调用 StartElementHandler 之前处理。

xmlparser.EndNamespaceDeclHandler(prefix)

当到达包含命名空间声明的元素的结束标记时调用。对于元素上的每个命名空间声明,以与调用 StartNamespaceDeclHandler 以指示每个命名空间声明作用域的开始顺序相反的顺序调用此函数。对此处理程序的调用在相应的 EndElementHandler 之后进行,以表示元素的结束。

xmlparser.CommentHandler(data)

针对注释调用。data 是注释的文本,不包括前导的 '<!--' 和尾随的 '-->'

xmlparser.StartCdataSectionHandler()

在 CDATA 部分的开头调用。需要此函数和 EndCdataSectionHandler 才能识别 CDATA 部分的语法开头和结尾。

xmlparser.EndCdataSectionHandler()

在 CDATA 部分的末尾调用。

xmlparser.DefaultHandler(data)

对于 XML 文档中没有指定适用处理程序的任何字符调用。这意味着属于可以报告的构造一部分,但没有为其提供处理程序的字符。

xmlparser.DefaultHandlerExpand(data)

这与 DefaultHandler() 相同,但不禁止内部实体的扩展。实体引用不会传递给默认处理程序。

xmlparser.NotStandaloneHandler()

如果 XML 文档尚未声明为独立文档,则会调用此函数。当存在外部子集或对参数实体的引用,但 XML 声明没有在 XML 声明中将 standalone 设置为 yes 时,会发生这种情况。如果此处理程序返回 0,则解析器将引发 XML_ERROR_NOT_STANDALONE 错误。如果未设置此处理程序,则解析器不会为此条件引发异常。

xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)

针对对外部实体的引用调用。base 是当前的基准,由先前调用 SetBase() 设置。公共标识符和系统标识符 systemIdpublicId 如果给定则为字符串;如果未给定公共标识符,则 publicId 将为 Nonecontext 值是不透明的,应仅按如下所述使用。

要解析外部实体,必须实现此处理程序。它负责使用 ExternalEntityParserCreate(context) 创建子解析器,使用适当的回调对其进行初始化并解析实体。此处理程序应返回一个整数;如果它返回 0,则解析器将引发 XML_ERROR_EXTERNAL_ENTITY_HANDLING 错误,否则解析将继续。

如果未提供此处理程序,则外部实体将由 DefaultHandler 回调报告(如果提供了回调)。

ExpatError 异常

ExpatError 异常有许多有趣的属性

ExpatError.code

Expat 的内部错误编号,用于指示特定的错误。errors.messages 字典将这些错误编号映射到 Expat 的错误消息。例如

from xml.parsers.expat import ParserCreate, ExpatError, errors

p = ParserCreate()
try:
    p.Parse(some_xml_document)
except ExpatError as err:
    print("Error:", errors.messages[err.code])

errors 模块还提供了错误消息常量和一个字典 codes,用于将这些消息映射回错误代码,请参见下文。

ExpatError.lineno

检测到错误的行号。第一行的编号为 1

ExpatError.offset

错误发生的行内的字符偏移量。第一列的编号为 0

示例

以下程序定义了三个处理程序,它们仅打印出其参数。

import xml.parsers.expat

# 3 handler functions
def start_element(name, attrs):
    print('Start element:', name, attrs)
def end_element(name):
    print('End element:', name)
def char_data(data):
    print('Character data:', repr(data))

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)

此程序的输出为

Start element: parent {'id': 'top'}
Start element: child1 {'name': 'paul'}
Character data: 'Text goes here'
End element: child1
Character data: '\n'
Start element: child2 {'name': 'fred'}
Character data: 'More text'
End element: child2
Character data: '\n'
End element: parent

内容模型描述

内容模型使用嵌套的元组来描述。每个元组包含四个值:类型、量词、名称和一个子级元组。子级只是其他内容模型描述。

前两个字段的值是在 xml.parsers.expat.model 模块中定义的常量。这些常量可以分为两组:模型类型组和量词组。

模型类型组中的常量为

xml.parsers.expat.model.XML_CTYPE_ANY

由模型名称命名的元素被声明为具有 ANY 的内容模型。

xml.parsers.expat.model.XML_CTYPE_CHOICE

命名的元素允许从多个选项中进行选择;这用于诸如 (A | B | C) 之类的内容模型。

xml.parsers.expat.model.XML_CTYPE_EMPTY

声明为 EMPTY 的元素具有此模型类型。

xml.parsers.expat.model.XML_CTYPE_MIXED
xml.parsers.expat.model.XML_CTYPE_NAME
xml.parsers.expat.model.XML_CTYPE_SEQ

表示一个接一个的模型的模型用此模型类型表示。这用于诸如 (A, B, C) 之类的模型。

量词组中的常量为

xml.parsers.expat.model.XML_CQUANT_NONE

未给出修饰符,因此它可以恰好出现一次,如 A

xml.parsers.expat.model.XML_CQUANT_OPT

该模型是可选的:它可以出现一次或根本不出现,如 A?

xml.parsers.expat.model.XML_CQUANT_PLUS

该模型必须出现一次或多次(如 A+)。

xml.parsers.expat.model.XML_CQUANT_REP

该模型必须出现零次或多次,如 A*

Expat 错误常量

以下常量在 xml.parsers.expat.errors 模块中提供。这些常量在解释发生错误时引发的 ExpatError 异常对象的某些属性时很有用。由于出于向后兼容性的原因,常量的值是错误消息而不是数字错误代码,因此您可以通过将其 code 属性与 errors.codes[errors.XML_ERROR_CONSTANT_NAME] 进行比较来实现此目的。

errors 模块具有以下属性

xml.parsers.expat.errors.codes

一个将字符串描述映射到其错误代码的字典。

在 3.2 版本中添加。

xml.parsers.expat.errors.messages

一个将数字错误代码映射到其字符串描述的字典。

在 3.2 版本中添加。

xml.parsers.expat.errors.XML_ERROR_ASYNC_ENTITY
xml.parsers.expat.errors.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF

属性值中的实体引用引用了外部实体而不是内部实体。

xml.parsers.expat.errors.XML_ERROR_BAD_CHAR_REF

一个字符引用引用了 XML 中不合法的字符(例如,字符 0,或 ‘&#0;’)。

xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF

一个实体引用引用了一个使用表示法声明的实体,因此无法解析。

xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE

一个属性在开始标记中使用了多次。

xml.parsers.expat.errors.XML_ERROR_INCORRECT_ENCODING
xml.parsers.expat.errors.XML_ERROR_INVALID_TOKEN

当输入字节无法正确分配给字符时引发;例如,UTF-8 输入流中的 NUL 字节(值 0)。

xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT

文档元素之后出现了空格以外的其他内容。

xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI

XML 声明出现在输入数据的开头以外的其他位置。

xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS

文档不包含任何元素(XML 要求所有文档都包含一个且只有一个顶级元素)。

xml.parsers.expat.errors.XML_ERROR_NO_MEMORY

Expat 无法在内部分配内存。

xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF

在不允许的位置找到了参数实体引用。

xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR

在输入中找到了不完整的字符。

xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF

一个实体引用包含了对同一实体的另一个引用;可能是通过不同的名称,也可能是间接的。

xml.parsers.expat.errors.XML_ERROR_SYNTAX

遇到了一些未指定的语法错误。

xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH

一个结束标签与最内层的打开的开始标签不匹配。

xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN

某个标记(例如开始标签)在流结束或遇到下一个标记之前未关闭。

xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY

引用了一个未定义的实体。

xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING

Expat 不支持文档的编码。

xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION

一个 CDATA 标记部分未关闭。

xml.parsers.expat.errors.XML_ERROR_EXTERNAL_ENTITY_HANDLING
xml.parsers.expat.errors.XML_ERROR_NOT_STANDALONE

解析器确定文档不是“独立的”,尽管它在 XML 声明中声明自己是独立的,并且设置了 NotStandaloneHandler 并返回了 0

xml.parsers.expat.errors.XML_ERROR_UNEXPECTED_STATE
xml.parsers.expat.errors.XML_ERROR_ENTITY_DECLARED_IN_PE
xml.parsers.expat.errors.XML_ERROR_FEATURE_REQUIRES_XML_DTD

请求的操作需要编译时包含 DTD 支持,但 Expat 的配置没有 DTD 支持。标准构建的 xml.parsers.expat 模块不应报告此错误。

xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING

在解析开始后请求了一个行为更改,而该更改只能在解析开始之前进行。这(目前)仅由 UseForeignDTD() 引发。

xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX

当启用命名空间处理时,发现了一个未声明的前缀。

xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX

文档试图删除与前缀关联的命名空间声明。

xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE

一个参数实体包含不完整的标记。

xml.parsers.expat.errors.XML_ERROR_XML_DECL

文档根本不包含文档元素。

xml.parsers.expat.errors.XML_ERROR_TEXT_DECL

在外部实体中解析文本声明时出现错误。

xml.parsers.expat.errors.XML_ERROR_PUBLICID

在公共 ID 中发现了不允许的字符。

xml.parsers.expat.errors.XML_ERROR_SUSPENDED

对挂起的解析器执行了请求的操作,但不允许这样做。这包括尝试提供额外的输入或停止解析器。

xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED

当解析器未挂起时,尝试恢复解析器。

xml.parsers.expat.errors.XML_ERROR_ABORTED

不应向 Python 应用程序报告此错误。

xml.parsers.expat.errors.XML_ERROR_FINISHED

对已完成解析输入的解析器执行了请求的操作,但不允许这样做。这包括尝试提供额外的输入或停止解析器。

xml.parsers.expat.errors.XML_ERROR_SUSPEND_PE
xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XML

尝试取消声明保留的命名空间前缀 xml 或将其绑定到另一个命名空间 URI。

xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XMLNS

尝试声明或取消声明保留的命名空间前缀 xmlns

xml.parsers.expat.errors.XML_ERROR_RESERVED_NAMESPACE_URI

尝试将保留的命名空间前缀 xmlxmlns 的 URI 绑定到另一个命名空间前缀。

xml.parsers.expat.errors.XML_ERROR_INVALID_ARGUMENT

不应向 Python 应用程序报告此错误。

xml.parsers.expat.errors.XML_ERROR_NO_BUFFER

不应向 Python 应用程序报告此错误。

xml.parsers.expat.errors.XML_ERROR_AMPLIFICATION_LIMIT_BREACH

输入放大因子(来自 DTD 和实体)的限制已被突破。

脚注