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

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


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

警告

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

在 3.7.1 版更改: SAX 解析器默認(rèn)不會再處理通用外部實體以便提升安全性。 在此之前,解析器會創(chuàng)建網(wǎng)絡(luò)連接來獲取遠(yuǎn)程文件或是從 DTD 和實體文件系統(tǒng)中加載本地文件。 此特性可通過在解析器對象上調(diào)用 setFeature() 對象并傳入?yún)?shù) feature_external_ges 來重新啟用。

可用的便捷函數(shù)如下所列:

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

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

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

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

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

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

類似于 parse(),但解析對象是作為形參傳入的緩沖區(qū) stringstring 必須為 str 實例或者 bytes-like object。

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

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

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

除了這些類,xml.sax 還提供了如下異常類。

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

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

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

這是其他 SAX 異常類的基類。

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

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

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

SAXException 的子類,當(dāng) SAX XMLReader 遇到不可識別的特性或?qū)傩詴r引發(fā)。 SAX 應(yīng)用程序和擴展可能會出于類似目的而使用這個類。

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

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

參見

SAX: The Simple API for XML

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

xml.sax.handler 模塊

應(yīng)用程序所提供對象的接口定義。

xml.sax.saxutils 模塊

可在 SAX 應(yīng)用程序中使用的便捷函數(shù)。

xml.sax.xmlreader 模塊

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

SAXException 對象?

SAXException 異常類支持下列方法:

SAXException.getMessage()?

返回描述錯誤條件的適合人類閱讀的消息。

SAXException.getException()?

返回一個封裝的異常對象或者 None。