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


警告

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

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

此模塊使用 pyexpat 模塊來(lái)提供對(duì) Expat 解析器的訪問(wèn)。 直接使用 pyexpat 模塊的方式已被棄用。

此模塊提供了一個(gè)異常和一個(gè)類(lèi)型對(duì)象:

exception xml.parsers.expat.ExpatError?

此異常會(huì)在 Expat 報(bào)錯(cuò)時(shí)被引發(fā)。 請(qǐng)參閱 ExpatError 異常 一節(jié)了解有關(guān)解讀 Expat 錯(cuò)誤的更多信息。

exception xml.parsers.expat.error?

ExpatError 的別名。

xml.parsers.expat.XMLParserType?

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

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

xml.parsers.expat.ErrorString(errno)?

返回給定錯(cuò)誤號(hào) errno 的解釋性字符串。

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

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

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

舉例來(lái)說(shuō),如果 namespace_separator 被設(shè)為空格符 (' ') 并對(duì)以下文檔進(jìn)行解析:

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

StartElementHandler 將為每個(gè)元素獲取以下字符串:

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

由于 pyexpat 所使用的 Expat 庫(kù)的限制,被返回的 xmlparser 實(shí)例只能被用來(lái)解析單個(gè) XML 文檔。 請(qǐng)為每個(gè)文檔調(diào)用 ParserCreate 來(lái)提供單獨(dú)的解析器實(shí)例。

參見(jiàn)

The Expat XML Parser

Expat 項(xiàng)目的主頁(yè)。

XMLParser對(duì)象?

xmlparser 對(duì)象具有以下方法:

xmlparser.Parse(data[, isfinal])?

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

xmlparser.ParseFile(file)?

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

xmlparser.SetBase(base)?

設(shè)置要用于解析聲明中的系統(tǒng)標(biāo)識(shí)符的相對(duì) URI 的基準(zhǔn)。 解析相對(duì)標(biāo)識(shí)符的任務(wù)會(huì)留給應(yīng)用程序進(jìn)行:這個(gè)值將作為 base 參數(shù)傳遞給 ExternalEntityRefHandler(), NotationDeclHandler()UnparsedEntityDeclHandler() 函數(shù)。

xmlparser.GetBase()?

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

xmlparser.GetInputContext()?

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

xmlparser.ExternalEntityParserCreate(context[, encoding])?

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

xmlparser.SetParamEntityParsing(flag)?

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

xmlparser.UseForeignDTD([flag])?

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

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

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

xmlparser 對(duì)象具有下列屬性:

xmlparser.buffer_size?

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

xmlparser.buffer_text?

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

xmlparser.buffer_used?

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

xmlparser.ordered_attributes?

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

xmlparser.specified_attributes?

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

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

xmlparser.ErrorByteIndex?

錯(cuò)誤發(fā)生位置的字節(jié)索引號(hào)。

xmlparser.ErrorCode?

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

xmlparser.ErrorColumnNumber?

錯(cuò)誤發(fā)生位置的列號(hào)。

xmlparser.ErrorLineNumber?

錯(cuò)誤發(fā)生位置的行號(hào)。

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

xmlparser.CurrentByteIndex?

解析器輸入的當(dāng)前字節(jié)索引號(hào)。

xmlparser.CurrentColumnNumber?

解析器輸入的當(dāng)前列號(hào)。

xmlparser.CurrentLineNumber?

解析器輸入的當(dāng)前行號(hào)。

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

xmlparser.XmlDeclHandler(version, encoding, standalone)?

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

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

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

xmlparser.EndDoctypeDeclHandler()?

當(dāng) Expat 完成解析文檔類(lèi)型聲明時(shí)被調(diào)用。 這要求 Expat 1.2 或更新版本。

xmlparser.ElementDeclHandler(name, model)?

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

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

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

xmlparser.StartElementHandler(name, attributes)?

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

xmlparser.EndElementHandler(name)?

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

xmlparser.ProcessingInstructionHandler(target, data)?

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

xmlparser.CharacterDataHandler(data)?

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

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

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

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

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

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

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

xmlparser.StartNamespaceDeclHandler(prefix, uri)?

當(dāng)一個(gè)元素包含命名空間聲明時(shí)被調(diào)用。 命名空間聲明會(huì)在為聲明所在的元素調(diào)用 StartElementHandler 之前被處理。

xmlparser.EndNamespaceDeclHandler(prefix)?

當(dāng)?shù)竭_(dá)包含命名空間聲明的元素的關(guān)閉標(biāo)記時(shí)被調(diào)用。 此方法會(huì)按照調(diào)用 StartNamespaceDeclHandler 以指明每個(gè)命名空間作用域的開(kāi)始的逆順序?yàn)樵厣系拿總€(gè)命名空間聲明調(diào)用一次。 對(duì)這個(gè)處理句柄的調(diào)用是在相應(yīng)的 EndElementHandler 之后針對(duì)元素的結(jié)束而進(jìn)行的。

xmlparser.CommentHandler(data)?

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

xmlparser.StartCdataSectionHandler()?

在一個(gè) CDATA 節(jié)的開(kāi)頭被調(diào)用。 需要此方法和 EndCdataSectionHandler 以便能夠標(biāo)識(shí) CDATA 節(jié)的語(yǔ)法開(kāi)始和結(jié)束。

xmlparser.EndCdataSectionHandler()?

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

xmlparser.DefaultHandler(data)?

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

xmlparser.DefaultHandlerExpand(data)?

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

xmlparser.NotStandaloneHandler()?

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

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

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

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

如果未提供這個(gè)處理句柄,外部實(shí)體會(huì)由 DefaultHandler 回調(diào)來(lái)報(bào)告,如果提供了該回調(diào)的話(huà)。

ExpatError 異常?

ExpatError 異常包含幾個(gè)有趣的屬性:

ExpatError.code?

Expat 對(duì)于指定錯(cuò)誤的內(nèi)部錯(cuò)誤號(hào)。 errors.messages 字典會(huì)將這些錯(cuò)誤號(hào)映射到 Expat 的錯(cuò)誤消息。 例如:

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 模塊也提供了一些錯(cuò)誤消息常量和一個(gè)將這些消息映射回錯(cuò)誤碼的字典 codes,參見(jiàn)下文。

ExpatError.lineno?

檢測(cè)到錯(cuò)誤所在的行號(hào)。 首行的行號(hào)為 1。

ExpatError.offset?

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

示例?

以下程序定義了三個(gè)處理句柄,會(huì)簡(jiǎn)單地打印出它們的參數(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)

來(lái)自這個(gè)程序的輸出是:

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)容模型是使用嵌套的元組來(lái)描述的。 每個(gè)元素包含四個(gè)值:類(lèi)型、限定符、名稱(chēng)和一個(gè)子元組。 子元組就是附加的內(nèi)容模型描述。

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

模型類(lèi)型組中的常量有:

xml.parsers.expat.model.XML_CTYPE_ANY

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

xml.parsers.expat.model.XML_CTYPE_CHOICE

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

xml.parsers.expat.model.XML_CTYPE_EMPTY

被聲明為 EMPTY 的元素具有此模型類(lèi)型。

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

代表彼此相連的一系列模型的模型用此模型類(lèi)型來(lái)指明。 這被用于 (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 錯(cuò)誤常量?

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

errors 模塊具有以下屬性:

xml.parsers.expat.errors.codes?

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

3.2 新版功能.

xml.parsers.expat.errors.messages?

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

3.2 新版功能.

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

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

xml.parsers.expat.errors.XML_ERROR_BAD_CHAR_REF?

指向一個(gè)在 XML 不合法的字符的字符引用 (例如,字符 0 或 '&#0;')。

xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF?

指向一個(gè)使用標(biāo)注聲明,因而無(wú)法被解析的實(shí)體的實(shí)體引用。

xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE?

一個(gè)屬性在一個(gè)開(kāi)始標(biāo)記中被使用超過(guò)一次。

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

當(dāng)一個(gè)輸入字節(jié)無(wú)法被正確分配給一個(gè)字符時(shí)引發(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ù)開(kāi)始位置以外的地方發(fā)現(xiàn) XML 聲明。

xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS?

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

xml.parsers.expat.errors.XML_ERROR_NO_MEMORY?

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

xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF?

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

xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR?

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

xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF?

一個(gè)實(shí)體引用包含了對(duì)同一實(shí)體的另一個(gè)引用;可能是通過(guò)不同的名稱(chēng),并可能是間接的引用。

xml.parsers.expat.errors.XML_ERROR_SYNTAX?

遇到了某個(gè)未指明的語(yǔ)法錯(cuò)誤。

xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH?

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

xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN?

某些記號(hào)(例如開(kāi)始標(biāo)記)在流結(jié)束或遇到下一個(gè)記號(hào)之前還未關(guān)閉。

xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY?

對(duì)一個(gè)未定義的實(shí)體進(jìn)行了引用。

xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING?

文檔編碼格式不被 Expat 所支持。

xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION?

一個(gè) CDATA 標(biāo)記節(jié)還未關(guān)閉。

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

解析器確定文檔不是“獨(dú)立的”但它卻在 XML 聲明中聲明自己是獨(dú)立的,并且 NotStandaloneHandler 被設(shè)置為返回 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?

請(qǐng)求了一個(gè)需要已編譯 DTD 支持的操作,但 Expat 被配置為不帶 DTD 支持。 此錯(cuò)誤應(yīng)當(dāng)絕對(duì)不會(huì)被 xml.parsers.expat 模塊的標(biāo)準(zhǔn)構(gòu)建版本所報(bào)告。

xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING?

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

xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX?

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

xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX?

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

xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE?

一個(gè)參數(shù)實(shí)體包含不完整的標(biāo)記。

xml.parsers.expat.errors.XML_ERROR_XML_DECL?

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

xml.parsers.expat.errors.XML_ERROR_TEXT_DECL?

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

xml.parsers.expat.errors.XML_ERROR_PUBLICID?

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

xml.parsers.expat.errors.XML_ERROR_SUSPENDED?

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

xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED?

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

xml.parsers.expat.errors.XML_ERROR_ABORTED?

此錯(cuò)誤不應(yīng)當(dāng)被報(bào)告給 Python 應(yīng)用程序。

xml.parsers.expat.errors.XML_ERROR_FINISHED?

在一個(gè)已經(jīng)完成解析輸入的解析器上請(qǐ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?

此錯(cuò)誤不應(yīng)當(dāng)被報(bào)告給 Python 應(yīng)用程序。

xml.parsers.expat.errors.XML_ERROR_NO_BUFFER?

此錯(cuò)誤不應(yīng)當(dāng)被報(bào)告給 Python 應(yīng)用程序。

xml.parsers.expat.errors.XML_ERROR_AMPLIFICATION_LIMIT_BREACH?

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

備注

1

包括在 XML 輸出中的編碼格式字符串應(yīng)當(dāng)符合適當(dāng)?shù)臉?biāo)準(zhǔn)。 例如 "UTF-8" 是有效的,但 "UTF8" 是無(wú)效的。 請(qǐng)參閱 https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDeclhttps://www.iana.org/assignments/character-sets/character-sets.xhtml