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


警告

pyexpat 模組對於惡意構造的資料不安全。 如果您需要解析不受信任或未經身份驗證的資料,請參閱XML 漏洞

xml.parsers.expat 模組是 Python 中 Expat 非驗證 XML 解析器的介面。 該模組提供了一個擴充套件型別 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* 提供一個值。 該值必須是單字元字串;如果字串的長度不合法,將引發 ValueErrorNone 被視為省略)。 啟用名稱空間處理後,將擴充套件屬於名稱空間的元素型別名稱和屬性名稱。 傳遞給元素處理程式 StartElementHandlerEndElementHandler 的元素名稱將是名稱空間 URI、名稱空間分隔符字元和名稱的本地部分的串聯。如果名稱空間分隔符是零位元組 (chr(0)),則名稱空間 URI 和本地部分將串聯在一起,而沒有任何分隔符。

例如,如果 *namespace_separator* 設定為空格字元 (' ') 並且解析了以下文件

<?xml version="1.0"?>
<root xmlns    = "http://default-namespace.org/"
      xmlns:py = "https://python.club.tw/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])

如果使用 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.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,對於一般實體則為 false(大多數應用程式只需要關注一般實體)。這僅在 Expat 庫的 1.95.0 版本或更高版本中可用。

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

腳註