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 元素處理句柄StartElementHandler
和EndElementHandler
的元素名稱(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_attributes
和specified_attributes
會(huì)被設(shè)為此解析器的值。
- xmlparser.SetParamEntityParsing(flag)?
控制參數(shù)實(shí)體(包括外部 DTD 子集)的解析。 可能的 flag 值有
XML_PARAM_ENTITY_PARSING_NEVER
,XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE
和XML_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)用,但StartDoctypeDeclHandler
和EndDoctypeDeclHandler
將不會(huì)被調(diào)用。為 flag 傳入假值將將撤消之前傳入真值的調(diào)用,除此之外沒(méi)有其他影響。
此方法只能在調(diào)用
Parse()
或ParseFile()
方法之前被調(diào)用;在已調(diào)用過(guò)這兩個(gè)方法之后調(diào)用它會(huì)導(dǎo)致引發(fā)ExpatError
且code
屬性被設(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ú)立”聲明的(可選)聲明。 version 和 encoding 將為字符串,而 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ì)完全按所顯示的被提供。 systemId 和 publicId 形參給出所指定的系統(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
,EndCdataSectionHandler
和ElementDeclHandler
回調(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, systemId 和 publicId 如果給出則均應(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í)符 systemId 和 publicId 如果給出則圴為字符串;如果公有標(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
或 '�
')。
- 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
andxmlns
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-EncodingDecl 和 https://www.iana.org/assignments/character-sets/character-sets.xhtml。