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


警告

pyexpat 模块无法抵御恶意构建的数据攻击。如果您需要解析不受信任或未经身份验证的数据,请参阅 XML 漏洞

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

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

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

异常 xml.parsers.expat.ExpatError

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

异常 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://www.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 使用 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.12.3 版新增。

xmlparser.GetReparseDeferralEnabled()

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

3.12.3 版新增。

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 给出当文档实例未指定属性时使用的属性的默认值,如果不存在默认值,则为 None#IMPLIED 值)。如果文档实例中需要提供该属性,则 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)实体声明调用。这仅适用于 1.2 版的 Expat 库;对于更新的版本,请改用 EntityDeclHandler。(Expat 库中的底层函数已被声明为过时。)

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

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

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 和实体)的限制已被突破。

脚注