xml.sax.xmlreader
— XML 解析器介面¶
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
,但將屬性名稱理解為 namespaceURI 和 localname 的兩元組。此外,它還提供了許多需要原始文件中出現的限定名稱的方法。此類別實現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()¶
返回所有屬性的限定名稱。