xml.parsers.expat --- 使用 Expat 的快速 XML 解析?


警告

pyexpat 模塊對于惡意構(gòu)建的數(shù)據(jù)是不安全的。 如果你需要解析不受信任或未經(jīng)身份驗證的數(shù)據(jù),請參閱 XML 漏洞。

xml.parsers.expat 模塊是針對 Expat 非驗證 XML 解析器的 Python 接口。 此模塊提供了一個擴展類型 xmlparser,它代表一個 XML 解析器的當前狀態(tài)。 在創(chuàng)建一個 xmlparser 對象之后,該對象的各個屬性可被設置為相應的處理句柄函數(shù)。 隨后當將一個 XML 文檔送入解析器時,就會為該 XML 文檔中的字符數(shù)據(jù)和標記調(diào)用處理句柄函數(shù)。

此模塊使用 pyexpat 模塊來提供對 Expat 解析器的訪問。 直接使用 pyexpat 模塊的方式已被棄用。

此模塊提供了一個異常和一個類型對象:

exception xml.parsers.expat.ExpatError?

此異常會在 Expat 報錯時被引發(fā)。 請參閱 ExpatError 異常 一節(jié)了解有關解讀 Expat 錯誤的更多信息。

exception xml.parsers.expat.error?

ExpatError 的別名。

xml.parsers.expat.XMLParserType?

來自 ParserCreate() 函數(shù)的返回值的類型。

xml.parsers.expat 模塊包含兩個函數(shù):

xml.parsers.expat.ErrorString(errno)?

返回給定錯誤號 errno 的解釋性字符串。

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

創(chuàng)建并返回一個新的 xmlparser 對象。 如果指定了 encoding,它必須為指定 XML 數(shù)據(jù)所使用的編碼格式名稱的字符串。 Expat 支持的編碼格式?jīng)]有 Python 那樣多,而且它的編碼格式庫也不能被擴展;它支持 UTF-8, UTF-16, ISO-8859-1 (Latin1) 和 ASCII。 如果給出了 encoding 1 則它將覆蓋隱式或顯式指定的文檔編碼格式。

可以選擇讓 Expat 為你做 XML 命名空間處理,這是通過提供 namespace_separator 值來啟用的。 該值必須是一個單字符的字符串;如果字符串的長度不合法則將引發(fā) ValueError (None 被視為等同于省略)。 當命名空間處理被啟用時,屬于特定命名空間的元素類型名稱和屬性名稱將被展開。 傳遞給The element name passed to the 元素處理句柄 StartElementHandlerEndElementHandler 的元素名稱將為命名空間 URI,命名空間分隔符和名稱的本地部分的拼接。 如果命名空間分隔符是一個零字節(jié) (chr(0)) 則命名空間 URI 和本地部分將被直接拼接而不帶任何分隔符。

舉例來說,如果 namespace_separator 被設為空格符 (' ') 并對以下文檔進行解析:

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

StartElementHandler 將為每個元素獲取以下字符串:

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

由于 pyexpat 所使用的 Expat 庫的限制,被返回的 xmlparser 實例只能被用來解析單個 XML 文檔。 請為每個文檔調(diào)用 ParserCreate 來提供單獨的解析器實例。

參見

The Expat XML Parser

Expat 項目的主頁。

XMLParser對象?

xmlparser 對象具有以下方法:

xmlparser.Parse(data[, isfinal])?

解析字符串 data 的內(nèi)容,調(diào)用適當?shù)奶幚砗瘮?shù)來處理解析后的數(shù)據(jù)。 在對此方法的最后一次調(diào)用時 isfinal 必須為真值;它允許以片段形式解析單個文件,而不是提交多個文件。 data 在任何時候都可以為空字符串。

xmlparser.ParseFile(file)?

解析從對象 file 讀取的 XML 數(shù)據(jù)。 file 僅需提供 read(nbytes) 方法,當沒有更多數(shù)據(jù)可讀時將返回空字符串。

xmlparser.SetBase(base)?

設置要用于解析聲明中的系統(tǒng)標識符的相對 URI 的基準。 解析相對標識符的任務會留給應用程序進行:這個值將作為 base 參數(shù)傳遞給 ExternalEntityRefHandler(), NotationDeclHandler()UnparsedEntityDeclHandler() 函數(shù)。

xmlparser.GetBase()?

返回包含之前調(diào)用 SetBase() 所設置的基準位置的字符串,或者如果未調(diào)用 SetBase() 則返回 None。

xmlparser.GetInputContext()?

將生成當前事件的輸入數(shù)據(jù)以字符串形式返回。 數(shù)據(jù)為包含文本的實體的編碼格式。 如果被調(diào)用時未激活事件處理句柄,則返回值將為 None

xmlparser.ExternalEntityParserCreate(context[, encoding])?

創(chuàng)建一個“子”解析器,可被用來解析由父解析器解析的內(nèi)容所引用的外部解析實體。 context 形參應當是傳遞給 ExternalEntityRefHandler() 處理函數(shù)的字符串,具體如下所述。 子解析器創(chuàng)建時 ordered_attributesspecified_attributes 會被設為此解析器的值。

xmlparser.SetParamEntityParsing(flag)?

控制參數(shù)實體(包括外部 DTD 子集)的解析。 可能的 flag 值有 XML_PARAM_ENTITY_PARSING_NEVER, XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONEXML_PARAM_ENTITY_PARSING_ALWAYS。 如果該旗標設置成功則返回真值。

xmlparser.UseForeignDTD([flag])?

調(diào)用時將 flag 設為真值(默認)將導致 Expat 調(diào)用 ExternalEntityRefHandler 時將所有參數(shù)設為 None 以允許加載替代的 DTD。 如果文檔不包含文檔類型聲明,ExternalEntityRefHandler 仍然會被調(diào)用,但 StartDoctypeDeclHandlerEndDoctypeDeclHandler 將不會被調(diào)用。

flag 傳入假值將將撤消之前傳入真值的調(diào)用,除此之外沒有其他影響。

此方法只能在調(diào)用 Parse()ParseFile() 方法之前被調(diào)用;在已調(diào)用過這兩個方法之后調(diào)用它會導致引發(fā) ExpatErrorcode 屬性被設為 errors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]。

xmlparser 對象具有下列屬性:

xmlparser.buffer_size?

buffer_text 為真值時所使用的緩沖區(qū)大小。 可以通過將此屬性賦一個新的整數(shù)值來設置一個新的緩沖區(qū)大小。 當大小發(fā)生改變時,緩沖區(qū)將被刷新。

xmlparser.buffer_text?

將此屬性設為真值會使得 xmlparser 對象緩沖 Expat 所返回的文本內(nèi)容以盡可能地避免多次調(diào)用 CharacterDataHandler() 回調(diào)。 這可以顯著地提升性能,因為 Expat 通常會將字符數(shù)據(jù)在每個行結(jié)束的位置上進行分塊。 此屬性默認為假值,但可以在任何時候被更改。

xmlparser.buffer_used?

buffer_text 被啟用時,緩沖區(qū)中存儲的字節(jié)數(shù)。 這些字節(jié)數(shù)據(jù)表示以 UTF-8 編碼的文本。 當 buffer_text 為假值時此屬性沒有任何實際意義。

xmlparser.ordered_attributes?

將該屬性設為非零整數(shù)會使得各個屬性被報告為列表而非字典。 各個屬性會按照在文檔文本中的出現(xiàn)順序顯示。 對于每個屬性,將顯示兩個列表條目:屬性名和屬性值。 (該模塊的較舊版本也使用了此格式。) 默認情況下,該屬性為假值;它可以在任何時候被更改。

xmlparser.specified_attributes?

如果設為非零整數(shù),解析器將只報告在文檔實例中指明的屬性而不報告來自屬性聲明的屬性。 設置此屬性的應用程序需要特別小心地使用從聲明中獲得的附加信息以符合 XML 處理程序的行為標準。 默認情況下,該屬性為假值;它可以在任何時候被更改。

下列屬性包含與 xmlparser 對象遇到的最近發(fā)生的錯誤有關聯(lián)的值,并且一旦對 Parse()ParseFile() 的調(diào)用引發(fā)了 xml.parsers.expat.ExpatError 異常就將只包含正確的值。

xmlparser.ErrorByteIndex?

錯誤發(fā)生位置的字節(jié)索引號。

xmlparser.ErrorCode?

指明問題的的數(shù)字代碼。 該值可被傳給 ErrorString() 函數(shù),或是與在 errors 對象中定義的常量之一進行比較。

xmlparser.ErrorColumnNumber?

錯誤發(fā)生位置的列號。

xmlparser.ErrorLineNumber?

錯誤發(fā)生位置的行號。

下列屬性包含 xmlparser 對象中關聯(lián)到當前解析位置的值。 在回調(diào)報告解析事件期間它們將指示生成事件的字符序列的第一個字符的位置。 當在回調(diào)的外部被調(diào)用時,所指示的位置將恰好位于最后的解析事件之后(無論是否存在關聯(lián)的回調(diào))。

xmlparser.CurrentByteIndex?

解析器輸入的當前字節(jié)索引號。

xmlparser.CurrentColumnNumber?

解析器輸入的當前列號。

xmlparser.CurrentLineNumber?

解析器輸入的當前行號。

可被設置的處理句柄列表。 要在一個 xmlparser 對象 o 上設置處理句柄,請使用 o.handlername = func。 handlername 必須從下面的列表中獲取,而 func 必須為接受正確數(shù)量參數(shù)的可調(diào)用對象。 所有參數(shù)均為字符串,除非另外指明。

xmlparser.XmlDeclHandler(version, encoding, standalone)?

當解析 XML 聲明時被調(diào)用。 XML 聲明是 XML 建議適用版本、文檔文本的編碼格式,以及可選的“獨立”聲明的(可選)聲明。 versionencoding 將為字符串,而 standalone 在文檔被聲明為獨立時將為 1,在文檔被聲明為非獨立時將為 0,或者在 standalone 短語被省略時則為 -1。 這僅適用于 Expat 的 1.95.0 或更新版本。

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

當 Expat 開始解析文檔類型聲明 (<!DOCTYPE ...) 時被調(diào)用。 doctypeName 會完全按所顯示的被提供。 systemIdpublicId 形參給出所指定的系統(tǒng)和公有標識符,如果被省略則為 None。 如果文檔包含內(nèi)部文檔聲明子集則 has_internal_subset 將為真值。 這要求 Expat 1.2 或更新的版本。

xmlparser.EndDoctypeDeclHandler()?

當 Expat 完成解析文檔類型聲明時被調(diào)用。 這要求 Expat 1.2 或更新版本。

xmlparser.ElementDeclHandler(name, model)?

為每個元素類型聲明調(diào)用一次。 name 為元素類型名稱,而 model 為內(nèi)容模型的表示形式。

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

為一個元素類型的每個已聲明屬性執(zhí)行調(diào)用。 如果一個屬性列表聲明聲明了三個屬性,這個處理句柄會被調(diào)用三次,每個屬性一次。 elname 是聲明所適用的元素的名稱而 attname 是已聲明的屬性的名稱。 屬性類型是作為 type 傳入的字符串;可能的值有 'CDATA', 'ID', 'IDREF', ... default 給出了當屬性未被文檔實例所指明時該屬性的默認值,或是為 None,如果沒有默認值 (#IMPLIED 值) 的話。 如果屬性必須在文檔實例中給出,則 required 將為真值。 這要求 Expat 1.95.0 或更新的版本。

xmlparser.StartElementHandler(name, attributes)?

在每個元素開始時調(diào)用。 name 是包含元素名稱的字符串,而 attributes 是元素的屬性。 如果 ordered_attributes 為真值,則屬性為列表形式 (完整描述參見 ordered_attributes)。 否則為將名稱映射到值的字典。

xmlparser.EndElementHandler(name)?

在每個元素結(jié)束時調(diào)用。

xmlparser.ProcessingInstructionHandler(target, data)?

在每次處理指令時調(diào)用。

xmlparser.CharacterDataHandler(data)?

針對字符數(shù)據(jù)調(diào)用。 此方法將被用于普通字符數(shù)據(jù)、CDATA 標記內(nèi)容以及可忽略的空白符。 需要區(qū)分這幾種情況的應用程序可以使用 StartCdataSectionHandler, EndCdataSectionHandlerElementDeclHandler 回調(diào)來收集必要的信息。

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

針對未解析(NDATA)實體聲明調(diào)用。 此方法僅存在于 Expat 庫的 1. 2 版;對于更新的版本,請改用 EntityDeclHandler。 (下層 Expat 庫中的對應函數(shù)已被聲明為過時。)

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

針對所有實體聲明被調(diào)用。 對于形參和內(nèi)部實體,value 將為給出實體的聲明內(nèi)容的字符串;對于外部實體將為 NonenotationName 形參對于已解析實體將為 None,對于未解析實體則為標注的名稱。 如果實體為形參實體則 is_parameter_entity 將為真值而如果為普通實體則為假值(大多數(shù)應用程序只需要關注普通實體)。 此方法僅從 1.95.0 版 Expat 庫開始才可用。

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

針對標注聲明被調(diào)用。 notationName, base, systemIdpublicId 如果給出則均應為字符串。 如果省略公有標識符,則 publicId 將為 None。

xmlparser.StartNamespaceDeclHandler(prefix, uri)?

當一個元素包含命名空間聲明時被調(diào)用。 命名空間聲明會在為聲明所在的元素調(diào)用 StartElementHandler 之前被處理。

xmlparser.EndNamespaceDeclHandler(prefix)?

當?shù)竭_包含命名空間聲明的元素的關閉標記時被調(diào)用。 此方法會按照調(diào)用 StartNamespaceDeclHandler 以指明每個命名空間作用域的開始的逆順序為元素上的每個命名空間聲明調(diào)用一次。 對這個處理句柄的調(diào)用是在相應的 EndElementHandler 之后針對元素的結(jié)束而進行的。

xmlparser.CommentHandler(data)?

針對注釋被調(diào)用。 data 是注釋的文本,不包括開頭的 '<!--' 和末尾的 '-->'。

xmlparser.StartCdataSectionHandler()?

在一個 CDATA 節(jié)的開頭被調(diào)用。 需要此方法和 EndCdataSectionHandler 以便能夠標識 CDATA 節(jié)的語法開始和結(jié)束。

xmlparser.EndCdataSectionHandler()?

在一個 CDATA 節(jié)的末尾被調(diào)用。

xmlparser.DefaultHandler(data)?

針對 XML 文檔中沒有指定適用處理句柄的任何字符被調(diào)用。 這包括了所有屬于可被報告的結(jié)構(gòu)的一部分,但未提供處理句柄的字符。

xmlparser.DefaultHandlerExpand(data)?

這與 DefaultHandler() 相同,但不會抑制內(nèi)部實體的擴展。 實體引用將不會被傳遞給默認處理句柄。

xmlparser.NotStandaloneHandler()?

當 XML 文檔未被聲明為獨立文檔時被調(diào)用。 這種情況發(fā)生在出現(xiàn)外部子集或?qū)?shù)實體的引用,但 XML 聲明沒有在 XML 聲明中將 standalone 設為 yes 的時候。 如果這個處理句柄返回 0,那么解析器將引發(fā) XML_ERROR_NOT_STANDALONE 錯誤。 如果這個處理句柄沒有被設置,那么解析器就不會為這個條件引發(fā)任何異常。

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

為對外部實體的引用執(zhí)行調(diào)用。 base 為當前的基準,由之前對 SetBase() 的調(diào)用設置。 公有和系統(tǒng)標識符 systemIdpublicId 如果給出則圴為字符串;如果公有標識符未給出,則 publicId 將為 None。 context 是僅根據(jù)以下說明來使用的不透明值。

對于要解析的外部實體,這個處理句柄必須被實現(xiàn)。 它負責使用 ExternalEntityParserCreate(context) 來創(chuàng)建子解析器,通過適當?shù)幕卣{(diào)將其初始化,并對實體進行解析。 這個處理句柄應當返回一個整數(shù);如果它返回 0,則解析器將引發(fā) XML_ERROR_EXTERNAL_ENTITY_HANDLING 錯誤,否則解析將會繼續(xù)。

如果未提供這個處理句柄,外部實體會由 DefaultHandler 回調(diào)來報告,如果提供了該回調(diào)的話。

ExpatError 異常?

ExpatError 異常包含幾個有趣的屬性:

ExpatError.code?

Expat 對于指定錯誤的內(nèi)部錯誤號。 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?

錯誤發(fā)生在行中的字符偏移量。 首列的列號為 0。

示例?

以下程序定義了三個處理句柄,會簡單地打印出它們的參數(shù)。:

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

內(nèi)容模型描述?

內(nèi)容模型是使用嵌套的元組來描述的。 每個元素包含四個值:類型、限定符、名稱和一個子元組。 子元組就是附加的內(nèi)容模型描述。

前兩個字段的值是在 xml.parsers.expat.model 模塊中定義的常量。 這些常量可分為兩組:模型類型組和限定符組。

模型類型組中的常量有:

xml.parsers.expat.model.XML_CTYPE_ANY

模型名稱所指定的元素被聲明為具有 ANY 內(nèi)容模型。

xml.parsers.expat.model.XML_CTYPE_CHOICE

命名元素允許從幾個選項中選擇;這被用于 (A | B | C) 形式的內(nèi)容模型。

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

未給出限定符,這樣它可以只出現(xiàn)一次,例如 A

xml.parsers.expat.model.XML_CQUANT_OPT

模型是可選的:它可以出現(xiàn)一次或完全不出現(xiàn),例如 A?。

xml.parsers.expat.model.XML_CQUANT_PLUS

模型必須出現(xiàn)一次或多次 (例如 A+)。

xml.parsers.expat.model.XML_CQUANT_REP

模型必須出現(xiàn)零次或多次,例如 A*。

Expat 錯誤常量?

下列常量是在 xml.parsers.expat.errors 模塊中提供的。 這些常量在有錯誤發(fā)生時解讀被引發(fā)的 ExpatError 異常對象的某些屬性時很有用處。 出于保持向下兼容性的理由,這些常量的值是錯誤 消息 而不是數(shù)字形式的錯誤 代碼,為此你可以將它的 code 屬性和 errors.codes[errors.XML_ERROR_CONSTANT_NAME] 進行比較。

errors 模塊具有以下屬性:

xml.parsers.expat.errors.codes?

將字符串描述映射到其錯誤代碼的字典。

3.2 新版功能.

xml.parsers.expat.errors.messages?

將數(shù)字形式的錯誤代碼映射到其字符串描述的字典。

3.2 新版功能.

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

屬性值中指向一個外部實體而非內(nèi)部實體的實體引用。

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?

當一個輸入字節(jié)無法被正確分配給一個字符時引發(fā);例如,在 UTF-8 輸入流中的 NUL 字節(jié) (值為 0)。

xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT?

在文檔元素之后出現(xiàn)空白符以外的內(nèi)容。

xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI?

在輸入數(shù)據(jù)開始位置以外的地方發(fā)現(xiàn) XML 聲明。

xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS?

文檔不包含任何元素(XML 要求所有文檔都包含恰好一個最高層級元素)。

xml.parsers.expat.errors.XML_ERROR_NO_MEMORY?

Expat 無法在內(nèi)部分配內(nèi)存。

xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF?

在不被允許的位置發(fā)現(xiàn)一個參數(shù)實體引用。

xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR?

在輸入中發(fā)出一個不完整的字符。

xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF?

一個實體引用包含了對同一實體的另一個引用;可能是通過不同的名稱,并可能是間接的引用。

xml.parsers.expat.errors.XML_ERROR_SYNTAX?

遇到了某個未指明的語法錯誤。

xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH?

一個結(jié)束標記不能匹配到最內(nèi)層的未關閉開始標記。

xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN?

某些記號(例如開始標記)在流結(jié)束或遇到下一個記號之前還未關閉。

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 標記節(jié)還未關閉。

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 模塊的標準構(gòu)建版本所報告。

xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING?

在解析開始之后請求一個只能在解析開始之前執(zhí)行的行為改變。 此錯誤(目前)只能由 UseForeignDTD() 所引發(fā)。

xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX?

當命名空間處理被啟用時發(fā)現(xiàn)一個未聲明的前綴。

xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX?

文檔試圖移除與某個前綴相關聯(lián)的命名空間聲明。

xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE?

一個參數(shù)實體包含不完整的標記。

xml.parsers.expat.errors.XML_ERROR_XML_DECL?

文檔完全未包含任何文檔元素。

xml.parsers.expat.errors.XML_ERROR_TEXT_DECL?

解析一個外部實體中的文本聲明時出現(xiàn)錯誤。

xml.parsers.expat.errors.XML_ERROR_PUBLICID?

在公有 id 中發(fā)現(xiàn)不被允許的字符。

xml.parsers.expat.errors.XML_ERROR_SUSPENDED?

在掛起的解析器上請求執(zhí)行操作,但未獲得允許。 這包括提供額外輸入或停止解析器的嘗試。

xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED?

在解析器未被掛起的時候執(zhí)行恢復解析器的嘗試。

xml.parsers.expat.errors.XML_ERROR_ABORTED?

此錯誤不應當被報告給 Python 應用程序。

xml.parsers.expat.errors.XML_ERROR_FINISHED?

在一個已經(jīng)完成解析輸入的解析器上請求執(zhí)行操作,但未獲得允許。 這包括提供額外輸入或停止解析器的嘗試。

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

An attempt was made to undeclare reserved namespace prefix xml or to bind it to another namespace URI.

xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XMLNS?

An attempt was made to declare or undeclare reserved namespace prefix xmlns.

xml.parsers.expat.errors.XML_ERROR_RESERVED_NAMESPACE_URI?

An attempt was made to bind the URI of one the reserved namespace prefixes xml and xmlns to another namespace prefix.

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?

The limit on input amplification factor (from DTD and entities) has been breached.

備注

1

包括在 XML 輸出中的編碼格式字符串應當符合適當?shù)臉藴省?例如 "UTF-8" 是有效的,但 "UTF8" 是無效的。 請參閱 https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDeclhttps://www.iana.org/assignments/character-sets/character-sets.xhtml。