xml.sax --- 支持 SAX2 解析器?

源代碼: Lib/xml/sax/__init__.py


xml.sax 包提供多個(gè)模塊,它們在 Python 上實(shí)現了用于 XML (SAX) 接口的簡(jiǎn)單 API。 這個(gè)包本身為 SAX API 用戶(hù)提供了一些最常用的 SAX 異常和便捷函數。

警告

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

在 3.7.1 版更改: SAX 解析器默認不會(huì )再處理通用外部實(shí)體以便提升安全性。 在此之前,解析器會(huì )創(chuàng )建網(wǎng)絡(luò )連接來(lái)獲取遠程文件或是從 DTD 和實(shí)體文件系統中加載本地文件。 此特性可通過(guò)在解析器對象上調用 setFeature() 對象并傳入參數 feature_external_ges 來(lái)重新啟用。

可用的便捷函數如下所列:

xml.sax.make_parser(parser_list=[])?

創(chuàng )建并返回一個(gè) SAX XMLReader 對象。 將返回第一個(gè)被找到的解析器。 如果提供了 parser_list,它必須為一個(gè)包含字符串的可迭代對象,這些字符串指定了具有名為 create_parser() 函數的模塊。 在 parser_list 中列出的模塊將在默認解析器列表中的模塊之前被使用。

在 3.8 版更改: parser_list 參數可以是任意可迭代對象,而不一定是列表。

xml.sax.parse(filename_or_stream, handler, error_handler=handler.ErrorHandler())?

創(chuàng )建一個(gè) SAX 解析器并用它來(lái)解析文檔。 用于傳入文檔的 filename_or_stream 可以是一個(gè)文件名或文件對象。 handler 形參必須是一個(gè) SAX ContentHandler 實(shí)例。 如果給出了 error_handler,則它必須是一個(gè) SAX ErrorHandler 實(shí)例;如果省略,則對于任何錯誤都將引發(fā) SAXParseException。 此函數沒(méi)有返回值;所有操作必須由傳入的 handler 來(lái)完成。

xml.sax.parseString(string, handler, error_handler=handler.ErrorHandler())?

類(lèi)似于 parse(),但解析對象是作為形參傳入的緩沖區 string。 string 必須為 str 實(shí)例或者 bytes-like object。

在 3.5 版更改: 增加了對 str 實(shí)例的支持。

典型的 SAX 應用程序會(huì )使用三種對象:讀取器、處理句柄和輸入源。 “讀取器”在此上下文中與解析器同義,即某個(gè)從輸入源讀取字節或字符,并產(chǎn)生事件序列的代碼段。 事件隨后將被分發(fā)給處理句柄對象,即由讀取器發(fā)起調用處理句柄上的某個(gè)方法。 因此 SAX 應用程序必須獲取一個(gè)讀取器對象,創(chuàng )建或打開(kāi)輸入源,創(chuàng )建處理句柄,并一起連接到這些對象。 作為準備工作的最后一步,將調用讀取器來(lái)解析輸入內容。 在解析過(guò)程中,會(huì )根據來(lái)自輸入數據的結構化和語(yǔ)義化事件來(lái)調用處理句柄對象上的方法。

就這些對象而言,只有接口部分是需要關(guān)注的;它們通常不是由應用程序本身來(lái)實(shí)例化。 由于 Python 沒(méi)有顯式的接口標記法,它們的正式引入形式是類(lèi),但應用程序可能會(huì )使用并非從已提供的類(lèi)繼承而來(lái)的實(shí)現。 InputSource, Locator, Attributes, AttributesNS 以及 XMLReader 接口是在 xml.sax.xmlreader 模塊中定義的。 處理句柄接口是在 xml.sax.handler 中定義的。 為了方便起見(jiàn),InputSource (它往往會(huì )被直接實(shí)例化) 和處理句柄類(lèi)也可以從 xml.sax 獲得。 這些接口的描述見(jiàn)下文。

除了這些類(lèi),xml.sax 還提供了如下異常類(lèi)。

exception xml.sax.SAXException(msg, exception=None)?

封裝某個(gè) XML 錯誤或警告。 這個(gè)類(lèi)可以包含來(lái)自 XML 解析器或應用程序的基本錯誤或警告信息:它可以被子類(lèi)化以提供額外的功能或是添加本地化信息。 請注意雖然在 ErrorHandler 接口中定義的處理句柄可以接收該異常的實(shí)例,但是并不要求實(shí)際引發(fā)該異常 --- 它也可以被用作信息的容器。

當實(shí)例化時(shí),msg 應當是適合人類(lèi)閱讀的錯誤描述。 如果給出了可選的 exception 形參,它應當為 None 或者解析代碼所捕獲的異常并會(huì )被作為信息傳遞出去。

這是其他 SAX 異常類(lèi)的基類(lèi)。

exception xml.sax.SAXParseException(msg, exception, locator)?

SAXException 的子類(lèi),針對解析錯誤引發(fā)。 這個(gè)類(lèi)的實(shí)例會(huì )被傳遞給 SAX ErrorHandler 接口的方法來(lái)提供關(guān)于解析錯誤的信息。 這個(gè)類(lèi)支持 SAX Locator 接口以及 SAXException 接口。

exception xml.sax.SAXNotRecognizedException(msg, exception=None)?

SAXException 的子類(lèi),當 SAX XMLReader 遇到不可識別的特性或屬性時(shí)引發(fā)。 SAX 應用程序和擴展可能會(huì )出于類(lèi)似目的而使用這個(gè)類(lèi)。

exception xml.sax.SAXNotSupportedException(msg, exception=None)?

SAXException 的子類(lèi),當 SAX XMLReader 被要求啟用某個(gè)不受支持的特性,或者將某個(gè)屬性設為具體實(shí)現不支持的值時(shí)引發(fā)。 SAX 應用程序和擴展可能會(huì )出于類(lèi)似目的而使用這個(gè)類(lèi)。

參見(jiàn)

SAX: The Simple API for XML

這個(gè)網(wǎng)站是 SAX API 定義的焦點(diǎn)。 它提供了一個(gè) Java 實(shí)現以及在線(xiàn)文檔。 還包括其他實(shí)現的鏈接和歷史信息。

xml.sax.handler 模塊

應用程序所提供對象的接口定義。

xml.sax.saxutils 模塊

可在 SAX 應用程序中使用的便捷函數。

xml.sax.xmlreader 模塊

解析器所提供對象的接口定義。

SAXException 對象?

SAXException 異常類(lèi)支持下列方法:

SAXException.getMessage()?

返回描述錯誤條件的適合人類(lèi)閱讀的消息。

SAXException.getException()?

返回一個(gè)封裝的異常對象或者 None。