xml.sax.xmlreader — XML 解析器介面

原始碼: Lib/xml/sax/xmlreader.py


SAX 解析器實現 XMLReader 介面。它們在 Python 模組中實現,該模組必須提供一個函式 create_parser()。此函式由不帶引數的 xml.sax.make_parser() 呼叫以建立新的解析器物件。

class xml.sax.xmlreader.XMLReader

可由 SAX 解析器繼承的基類。

class xml.sax.xmlreader.IncrementalParser

在某些情況下,不希望一次性解析輸入源,而是希望在文件塊可用時將其提供給解析器。請注意,讀取器通常也不會讀取整個檔案,而是分塊讀取;儘管如此,parse() 在整個文件處理完畢之前不會返回。因此,如果不希望 parse() 的阻塞行為,則應使用這些介面。

解析器例項化後,它會立即準備好接受來自 feed 方法的資料。在透過呼叫 close 完成解析後,必須呼叫 reset 方法以使解析器準備好接受新資料,無論是透過 feed 還是使用 parse 方法。

請注意,這些方法在解析期間(即在呼叫 parse 之後且在它返回之前)不得 呼叫。

預設情況下,該類還使用 IncrementalParser 介面的 feed、close 和 reset 方法來實現 XMLReader 介面的 parse 方法,以方便 SAX 2.0 驅動程式編寫者。

class xml.sax.xmlreader.Locator

將 SAX 事件與文件位置相關聯的介面。定位器物件僅在呼叫 DocumentHandler 方法期間返回有效結果;在任何其他時間,結果都是不可預測的。如果資訊不可用,方法可能返回 None

class xml.sax.xmlreader.InputSource(system_id=None)

XMLReader 讀取實體所需資訊的封裝。

此類別可以包含有關公共識別符號、系統識別符號、位元組流(可能包含字元編碼資訊)和/或實體的字元流的資訊。

應用程式將建立此類的物件,用於 XMLReader.parse() 方法以及從 EntityResolver.resolveEntity 返回。

InputSource 屬於應用程式,XMLReader 不允許修改從應用程式傳遞給它的 InputSource 物件,儘管它可以建立副本並修改這些副本。

class xml.sax.xmlreader.AttributesImpl(attrs)

這是 Attributes 介面的實現(參見 Attributes 介面 一節)。這是一個類似字典的物件,表示 startElement() 呼叫中的元素屬性。除了最有用的字典操作之外,它還支援介面描述的許多其他方法。此類物件應由讀取器例項化;attrs 必須是包含屬性名稱到屬性值的對映的類似字典的物件。

class xml.sax.xmlreader.AttributesNSImpl(attrs, qnames)

AttributesImpl 的名稱空間感知變體,它將被傳遞給 startElementNS()。它派生自 AttributesImpl,但將屬性名稱理解為 namespaceURIlocalname 的兩元組。此外,它還提供了許多需要原始文件中出現的限定名稱的方法。此類別實現 AttributesNS 介面(參見 AttributesNS 介面 一節)。

XMLReader 物件

XMLReader 介面支援以下方法

XMLReader.parse(source)

處理輸入源,生成 SAX 事件。source 物件可以是系統識別符號(標識輸入源的字串——通常是檔名或 URL)、pathlib.Path路徑類 物件,或 InputSource 物件。當 parse() 返回時,輸入已完全處理,解析器物件可以丟棄或重置。

3.5 版本中有所變更: 增加了對字元流的支援。

3.8 版本中有所變更: 增加了對路徑類物件的支援。

XMLReader.getContentHandler()

返回當前的 ContentHandler

XMLReader.setContentHandler(handler)

設定當前的 ContentHandler。如果沒有設定 ContentHandler,內容事件將被丟棄。

XMLReader.getDTDHandler()

返回當前的 DTDHandler

XMLReader.setDTDHandler(handler)

設定當前的 DTDHandler。如果沒有設定 DTDHandler,DTD 事件將被丟棄。

XMLReader.getEntityResolver()

返回當前的 EntityResolver

XMLReader.setEntityResolver(handler)

設定當前的 EntityResolver。如果沒有設定 EntityResolver,解析外部實體的嘗試將導致開啟實體的系統識別符號,如果不可用則會失敗。

XMLReader.getErrorHandler()

返回當前的 ErrorHandler

XMLReader.setErrorHandler(handler)

設定當前的錯誤處理器。如果沒有設定 ErrorHandler,錯誤將作為異常引發,警告將打印出來。

XMLReader.setLocale(locale)

允許應用程式設定錯誤和警告的區域設定。

SAX 解析器不需要為錯誤和警告提供本地化;但是,如果它們無法支援所請求的區域設定,則必須引發 SAX 異常。應用程式可以在解析過程中請求更改區域設定。

XMLReader.getFeature(featurename)

返回特性 featurename 的當前設定。如果特性未被識別,則會引發 SAXNotRecognizedException。眾所周知的特性名稱列在模組 xml.sax.handler 中。

XMLReader.setFeature(featurename, value)

featurename 設定為 value。如果特性未被識別,則會引發 SAXNotRecognizedException。如果解析器不支援該特性或其設定,則會引發 SAXNotSupportedException

XMLReader.getProperty(propertyname)

返回屬性 propertyname 的當前設定。如果屬性未被識別,則會引發 SAXNotRecognizedException。眾所周知的屬性名稱列在模組 xml.sax.handler 中。

XMLReader.setProperty(propertyname, value)

propertyname 設定為 value。如果屬性未被識別,則會引發 SAXNotRecognizedException。如果解析器不支援該屬性或其設定,則會引發 SAXNotSupportedException

IncrementalParser 物件

IncrementalParser 的例項提供以下附加方法

IncrementalParser.feed(data)

處理一段 data

IncrementalParser.close()

假定文件的結尾。這將檢查只能在結尾處檢查的良好格式條件,呼叫處理器,並可能清理解析期間分配的資源。

IncrementalParser.reset()

在呼叫 close 之後呼叫此方法以重置解析器,使其準備好解析新文件。在呼叫 close 後不呼叫 reset 就呼叫 parse 或 feed 的結果是未定義的。

Locator 物件

Locator 的例項提供這些方法

Locator.getColumnNumber()

返回當前事件開始的列號。

Locator.getLineNumber()

返回當前事件開始的行號。

Locator.getPublicId()

返回當前事件的公共識別符號。

Locator.getSystemId()

返回當前事件的系統識別符號。

InputSource 物件

InputSource.setPublicId(id)

設定此 InputSource 的公共識別符號。

InputSource.getPublicId()

返回此 InputSource 的公共識別符號。

InputSource.setSystemId(id)

設定此 InputSource 的系統識別符號。

InputSource.getSystemId()

返回此 InputSource 的系統識別符號。

InputSource.setEncoding(encoding)

設定此 InputSource 的字元編碼。

編碼必須是 XML 編碼宣告可接受的字串(參見 XML 推薦標準的第 4.3.3 節)。

如果 InputSource 也包含字元流,則其編碼屬性將被忽略。

InputSource.getEncoding()

獲取此 InputSource 的字元編碼。

InputSource.setByteStream(bytefile)

為此輸入源設定位元組流(一個 二進位制檔案)。

如果還指定了字元流,SAX 解析器將忽略此項,但它會優先使用位元組流而不是自己開啟 URI 連線。

如果應用程式知道位元組流的字元編碼,則應使用 setEncoding 方法進行設定。

InputSource.getByteStream()

獲取此輸入源的位元組流。

getEncoding 方法將返回此位元組流的字元編碼,如果未知則返回 None

InputSource.setCharacterStream(charfile)

為此輸入源設定字元流(一個 文字檔案)。

如果指定了字元流,SAX 解析器將忽略任何位元組流,並且不會嘗試開啟到系統識別符號的 URI 連線。

InputSource.getCharacterStream()

獲取此輸入源的字元流。

Attributes 介面

Attributes 物件實現 對映協議 的一部分,包括方法 copy(), get(), __contains__(), items(), keys()values()。還提供以下方法

Attributes.getLength()

返回屬性的數量。

Attributes.getNames()

返回屬性的名稱。

Attributes.getType(name)

返回屬性 name 的型別,通常為 'CDATA'

Attributes.getValue(name)

返回屬性 name 的值。

AttributesNS 介面

此介面是 Attributes 介面的子型別(請參見 Attributes 介面 一節)。該介面支援的所有方法在 AttributesNS 物件上也可用。

還提供以下方法

AttributesNS.getValueByQName(name)

返回限定名稱的值。

AttributesNS.getNameByQName(name)

返回限定 name(namespace, localname) 對。

AttributesNS.getQNameByName(name)

返回 (namespace, localname) 對的限定名稱。

AttributesNS.getQNames()

返回所有屬性的限定名稱。