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

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


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

警告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

參見

SAX: The Simple API for XML

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

xml.sax.handler 模塊

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

xml.sax.saxutils 模塊

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

xml.sax.xmlreader 模塊

解析器所提供對(duì)象的接口定義。

SAXException 對(duì)象?

SAXException 異常類支持下列方法:

SAXException.getMessage()?

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

SAXException.getException()?

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