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


备注

如果您需要解析不受信任或未经身份验证的数据,请参阅 XML 安全

xml.parsers.expat 模块是 Expat 非验证 XML 解析器的 Python 接口。该模块提供了一个单一的扩展类型 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* 的值来启用。该值必须是一个单字符字符串;如果字符串长度非法(None 被视为与省略相同),则会引发 ValueError。启用命名空间处理后,属于命名空间的元素类型名称和属性名称将被展开。传递给元素处理程序 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])

调用此方法并将 *flag* 设置为 true(默认值)将导致 Expat 调用 ExternalEntityRefHandler,所有参数均为 None,以允许加载替代 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,否则为通用实体(大多数应用程序只关心通用实体)。这仅从 Expat 库的 1.95.0 版本开始可用。

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

为符号声明调用。*notationName*、*base*、*systemId* 和 *publicId*(如果给定)均为字符串。如果省略公共标识符,*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 声明中未将 standalone 设置为 yes 时,会发生这种情况。如果此处理程序返回 0,则解析器将引发 XML_ERROR_NOT_STANDALONE 错误。如果未设置此处理程序,则解析器不会为此情况引发异常。

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

为外部实体引用调用。*base* 是当前基地址,由之前对 SetBase() 的调用设置。公共和系统标识符,*systemId* 和 *publicId*,如果给定,则为字符串;如果未给定公共标识符,*publicId* 将为 None。*context* 值是不透明的,只应按如下所述使用。

要解析外部实体,必须实现此处理程序。它负责使用 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 输入流中的空字节(值 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 和实体)的限制已被突破。

xml.parsers.expat.errors.XML_ERROR_NOT_STARTED

解析器在启动之前尝试停止或暂停。

在 3.14 版本加入。

脚注