xml.dom
--- 文檔對象模型 API?
文檔對象模型“DOM”是一個(gè)來(lái)自萬(wàn)維網(wǎng)聯(lián)盟(W3C)的跨語(yǔ)言 API,用于訪(fǎng)問(wèn)和修改 XML 文檔。 DOM 的實(shí)現將 XML 文檔以樹(shù)結構表示,或者允許客戶(hù)端代碼從頭構建這樣的結構。 然后它會(huì )通過(guò)一組提供通用接口的對象賦予對結構的訪(fǎng)問(wèn)權。
DOM 特別適用于進(jìn)行隨機訪(fǎng)問(wèn)的應用。 SAX 僅允許你每次查看文檔的一小部分。 如果你正在查看一個(gè) SAX 元素,你將不能訪(fǎng)問(wèn)其他元素。 如果你正在查看一個(gè)文本節點(diǎn),你將不能訪(fǎng)問(wèn)包含它的元素。 當你編寫(xiě)一個(gè) SAX 應用時(shí),你需要在你自己的代碼的某個(gè)地方記住你的程序在文檔中的位置。 SAX 不會(huì )幫你做這件事。 并且,如果你想要在 XML 文檔中向前查看,你是絕對辦不到的。
有些應用程序在不能訪(fǎng)問(wèn)樹(shù)的事件驅動(dòng)模型中是根本無(wú)法編寫(xiě)的。 當然你可以在 SAX 事件中自行構建某種樹(shù),但是 DOM 可以使你避免編寫(xiě)這樣的代碼。 DOM 是針對 XML 數據的標準樹(shù)表示形式。
文檔對象模型是由 W3C 分階段定義的,在其術(shù)語(yǔ)中稱(chēng)為“層級”。 Python 中該 API 的映射大致是基于 DOM 第 2 層級的建議。
DOM 應用程序通常從將某些 XML 解析為 DOM 開(kāi)始。 此操作如何實(shí)現完全未被 DOM 第 1 層級所涉及,而第 2 層級也只提供了有限的改進(jìn):有一個(gè) DOMImplementation
對象類(lèi),它提供對 Document
創(chuàng )建方法的訪(fǎng)問(wèn),但卻沒(méi)有辦法以不依賴(lài)具體實(shí)現的方式訪(fǎng)問(wèn) XML 讀取器/解析器/文檔創(chuàng )建器。 也沒(méi)有當不存在 Document
對象的情況下訪(fǎng)問(wèn)這些方法的定義良好的方式。 在 Python 中,每個(gè) DOM 實(shí)現將提供一個(gè)函數 getDOMImplementation()
。 DOM 第 3 層級增加了一個(gè)載入/存儲規格說(shuō)明,它定義了與讀取器的接口,但這在 Python 標準庫中尚不可用。
一旦你得到了 DOM 文檔對象,你就可以通過(guò) XML 文檔的屬性和方法訪(fǎng)問(wèn)它的各個(gè)部分。 這些屬性定義在 DOM 規格說(shuō)明當中;參考指南的這一部分描述了 Python 對此規格說(shuō)明的解讀。
W3C 提供的規格說(shuō)明定義了適用于 Java, ECMAScript 和 OMG IDL 的 DOM API。 這里定義的 Python 映射很大程度上是基于此規格說(shuō)明的 IDL 版本,但并不要求嚴格映射(但具體實(shí)現可以自由地支持對 IDL 的嚴格映射)。 請參閱 一致性 一節查看有關(guān)映射要求的詳細討論。
參見(jiàn)
- 文檔對象模型 (DOM) 第 2 層級規格說(shuō)明
被 Python DOM API 作為基礎的 W3C 建議。
- 文檔對象模型 (DOM) 第 1 層級規格說(shuō)明
被
xml.dom.minidom
所支持的 W3C 針對 DOM 的建議。- Python Language Mapping Specification
此文檔指明了從 OMG IDL 到 Python 的映射。
模塊內容?
xml.dom
包含下列函數:
- xml.dom.registerDOMImplementation(name, factory)?
注冊 factory 函數并使用名稱(chēng) name。 該工廠(chǎng)函數應當返回一個(gè)實(shí)現了
DOMImplementation
接口的對象。 該工廠(chǎng)函數可每次都返回相同對象,或每次調用都返回新的對象,視具體實(shí)現的要求而定(例如該實(shí)現是否支持某些定制功能)。
- xml.dom.getDOMImplementation(name=None, features=())?
返回一個(gè)適當的 DOM 實(shí)現。 name 是通用名稱(chēng)、DOM 實(shí)現的模塊名稱(chēng)或者
None
。 如果它不為None
,則會(huì )導入相應模塊并在導入成功時(shí)返回一個(gè)DOMImplementation
對象。 如果沒(méi)有給出名稱(chēng),并且如果設置了PYTHON_DOM
環(huán)境變量,此變量會(huì )被用來(lái)查找相應的實(shí)現。如果未給出 name,此函數會(huì )檢查可用的實(shí)現來(lái)查找具有所需特性集的一個(gè)。 如果找不到任何實(shí)現,則會(huì )引發(fā)
ImportError
。 features 集必須是包含(feature, version)
對的序列,它會(huì )被傳給可用的DOMImplementation
對象上的hasFeature()
方法。
還提供了一些便捷常量:
- xml.dom.EMPTY_NAMESPACE?
該值用于指明沒(méi)有命名空間被關(guān)聯(lián)到 DOM 中的某個(gè)節點(diǎn)。 它通常被作為某個(gè)節點(diǎn)的
namespaceURI
,或者被用作某個(gè)命名空間專(zhuān)屬方法的 namespaceURI 參數。
- xml.dom.XML_NAMESPACE?
關(guān)聯(lián)到保留前綴
xml
的命名空間 URI,如 XML 中的命名空間 (第 4 節) 所定義的。
- xml.dom.XMLNS_NAMESPACE?
命名空間聲明的命名空間 URI,如 文檔對象模型 (DOM) 第 2 層級核心規格說(shuō)明 (第 1.1.8節) 所定義的。
- xml.dom.XHTML_NAMESPACE?
XHTML 命名空間的 URI,如 XHTML 1.0: 擴展超文本標記語(yǔ)言 (第 3.1.1 節) 所定義的。
此外,xml.dom
還包含一個(gè)基本 Node
類(lèi)和一些 DOM 異常類(lèi)。 此模塊提供的 Node
類(lèi)未實(shí)現 DOM 規格描述所定義的任何方法和屬性;實(shí)際的 DOM 實(shí)現必須提供它們。 提供 Node
類(lèi)作為此模塊的一部分并沒(méi)有提供用于實(shí)際的 Node
對象的 nodeType
屬性的常量;它們是位于類(lèi)內而不是位于模塊層級以符合 DOM 規格描述。
DOM 中的對象?
DOM 的權威文檔是來(lái)自 W3C 的 DOM 規格描述。
請注意,DOM 屬性也可以作為節點(diǎn)而不是簡(jiǎn)單的字符串進(jìn)行操作。 然而,必須這樣做的情況相當少見(jiàn),所以這種用法還沒(méi)有被寫(xiě)入文檔。
接口 |
部件 |
目的 |
---|---|---|
|
底層實(shí)現的接口。 |
|
|
文檔中大多數對象的基本接口。 |
|
|
節點(diǎn)序列的接口。 |
|
|
有關(guān)處理文檔所需聲明的信息。 |
|
|
表示整個(gè)文檔的對象。 |
|
|
文檔層次結構中的元素節點(diǎn)。 |
|
|
元素節點(diǎn)上的屬性值節點(diǎn)。 |
|
|
源文檔中注釋的表示形式。 |
|
|
包含文檔中文本內容的節點(diǎn)。 |
|
|
處理指令表示形式。 |
描述在 Python 中使用 DOM 定義的異常的小節。
DOMImplementation 對象?
DOMImplementation
接口提供了一種讓?xiě)贸绦虼_定他們所使用的 DOM 中某一特性可用性的方式。 DOM 第 2 級還添加了使用 DOMImplementation
來(lái)創(chuàng )建新的 Document
和 DocumentType
對象的能力。
- DOMImplementation.hasFeature(feature, version)?
如果字符串對 feature 和 version 所標識的特性已被實(shí)現則返回
True
。
- DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)?
返回一個(gè)新的
Document
對象 (DOM 的根節點(diǎn)),包含一個(gè)具有給定 namespaceUri 和 qualifiedName 的下級Element
對象。 doctype 必須為由createDocumentType()
創(chuàng )建的DocumentType
對象,或者為None
。 在 Python DOM API 中,前兩個(gè)參數也可為None
以表示不要創(chuàng )建任何下級Element
。
- DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)?
返回一個(gè)新的封裝了給定 qualifiedName, publicId 和 systemId 字符串的
DocumentType
對象,它表示包含在 XML 文檔類(lèi)型聲明中的信息。
節點(diǎn)對象?
XML 文檔的所有組成部分都是 Node
的子類(lèi)。
- Node.nodeType?
一個(gè)代表節點(diǎn)類(lèi)型的整數。 類(lèi)型符號常量在
Node
對象上:ELEMENT_NODE
,ATTRIBUTE_NODE
,TEXT_NODE
,CDATA_SECTION_NODE
,ENTITY_NODE
,PROCESSING_INSTRUCTION_NODE
,COMMENT_NODE
,DOCUMENT_NODE
,DOCUMENT_TYPE_NODE
,NOTATION_NODE
。 這是個(gè)只讀屬性。
- Node.parentNode?
當前節點(diǎn)的上級,或者對于文檔節點(diǎn)則為
None
。 該值總是一個(gè)Node
對象或者None
。 對于Element
節點(diǎn),這將為上級元素,但對于根元素例外,在此情況下它將為Document
對象。 對于Attr
節點(diǎn),它將總是為None
。 這是個(gè)只讀屬性。
- Node.attributes?
屬性對象的
NamedNodeMap
。 這僅對元素才有實(shí)際值;其它對象會(huì )為該屬性提供None
值。 這是個(gè)只讀屬性。
- Node.previousSibling?
在此節點(diǎn)之前具有相同上級的相鄰節點(diǎn)。 例如結束標記緊接在在 self 元素的開(kāi)始標記之前的元素。 當然,XML 文檔并非只是由元素組成,因此之前相鄰節點(diǎn)可以是文本、注釋或者其他內容。 如果此節點(diǎn)是上級的第一個(gè)子節點(diǎn),則該屬性將為
None
。 這是一個(gè)只讀屬性。
- Node.nextSibling?
在此節點(diǎn)之后具有相同上級的相鄰節點(diǎn)。 另請參見(jiàn)
previousSibling
。 如果此節點(diǎn)是上級的最后一個(gè)子節點(diǎn),則該屬性將為None
。 這是一個(gè)只讀屬性。
- Node.childNodes?
包含在此節點(diǎn)中的節點(diǎn)列表。 這是一個(gè)只讀屬性。
- Node.firstChild?
節點(diǎn)的第一個(gè)下級,如果有的話(huà),否則為
None
。 這是個(gè)只讀屬性。
- Node.lastChild?
節點(diǎn)的最后一個(gè)下級,如果有的話(huà),否則為
None
。 這是個(gè)只讀屬性。
- Node.localName?
tagName
在冒號之后的部分,如果有冒號的話(huà),否則為整個(gè)tagName
。 該值為一個(gè)字符串。
- Node.prefix?
tagName
在冒號之前的部分,如果有冒號的話(huà),否則為空字符串。 該值為一個(gè)字符串或者為None
。
- Node.namespaceURI?
關(guān)聯(lián)到元素名稱(chēng)的命名空間。 這將是一個(gè)字符串或為
None
。 這是個(gè)只讀屬性。
- Node.nodeName?
這對于每種節點(diǎn)類(lèi)型具有不同的含義;請查看 DOM 規格說(shuō)明來(lái)了解詳情。 你總是可以從其他特征屬性例如元素的
tagName
特征屬性或屬性的name
特征屬性獲取你能從這里獲取的信息。 對于所有節點(diǎn)類(lèi)型,這個(gè)屬性的值都將是一個(gè)字符串或為None
。 這是一個(gè)只讀屬性。
- Node.nodeValue?
這對于每種節點(diǎn)類(lèi)型具有不同的含義;請查看 DOM 規格說(shuō)明來(lái)了解詳情。 具體情況與
nodeName
的類(lèi)似。 該值是一個(gè)字符串或為None
。
- Node.hasAttributes()?
如果該節點(diǎn)具有任何屬性則返回
True
。
- Node.hasChildNodes()?
如果該節點(diǎn)具有任何子節點(diǎn)則返回
True
。
- Node.isSameNode(other)?
如果 other 指向的節點(diǎn)就是此節點(diǎn)則返回
True
。 這對于使用了任何代理架構的 DOM 實(shí)現來(lái)說(shuō)特別有用(因為多個(gè)對象可能指向相同節點(diǎn))。備注
這是基于已提議的 DOM 第 3 等級 API,目前尚處于“起草”階段,但這個(gè)特定接口看來(lái)并不存在爭議。 來(lái)自 W3C 的修改將不會(huì )影響 Python DOM 接口中的這個(gè)方法(不過(guò)針對它的任何新 W3C API 也將受到支持)。
- Node.appendChild(newChild)?
在子節點(diǎn)列表末尾添加一個(gè)新的子節點(diǎn),返回 newChild。 如果節點(diǎn)已存在于樹(shù)結構中,它將先被移除。
- Node.insertBefore(newChild, refChild)?
在現有的子節點(diǎn)之前插入一個(gè)新的子節點(diǎn)。 它必須屬于 refChild 是這個(gè)節點(diǎn)的子節點(diǎn)的情況;如果不是,則會(huì )引發(fā)
ValueError
。newChild 會(huì )被返回。 如果 refChild 為None
,它會(huì )將 newChild 插入到子節點(diǎn)列表的末尾。
- Node.removeChild(oldChild)?
移除一個(gè)子節點(diǎn)。 oldChild 必須是這個(gè)節點(diǎn)的子節點(diǎn);如果不是,則會(huì )引發(fā)
ValueError
。 成功時(shí) oldChild 會(huì )被返回。 如果 oldChild 將不再被繼續使用,則將調用它的unlink()
方法。
- Node.replaceChild(newChild, oldChild)?
將一個(gè)現有節點(diǎn)替換為新的節點(diǎn)。 這必須屬于 oldChild 是該節點(diǎn)的子節點(diǎn)的情況;如果不是,則會(huì )引發(fā)
ValueError
。
- Node.normalize()?
合并相鄰的文本節點(diǎn)以便將所有文本段存儲為單個(gè)
Text
實(shí)例。 這可以簡(jiǎn)化許多應用程序處理來(lái)自 DOM 樹(shù)文本的操作。
- Node.cloneNode(deep)?
克隆此節點(diǎn)。 設置 deep 表示也克隆所有子節點(diǎn)。 此方法將返回克隆的節點(diǎn)。
節點(diǎn)列表對象?
NodeList
代表一個(gè)節點(diǎn)列表。 在 DOM 核心建議中這些對象有兩種使用方式: 由 Element
對象提供作為其子節點(diǎn)列表,以及由 Node
的 getElementsByTagName()
和 getElementsByTagNameNS()
方法通過(guò)此接口返回對象來(lái)表示查詢(xún)結果。
DOM 第 2 層級建議為這些對象定義一個(gè)方法和一個(gè)屬性:
- NodeList.item(i)?
從序列中返回第 i 項,如果序列不為空的話(huà),否則返回
None
。 索引號 i 不允許小于零或大于等于序列的長(cháng)度。
- NodeList.length?
序列中的節點(diǎn)數量。
此外,Python DOM 接口還要求提供一些額外支持來(lái)允許將 NodeList
對象用作 Python 序列。 所有 NodeList
實(shí)現都必須包括對 __len__()
和 __getitem__()
的支持;這樣 NodeList
就允許使用 for
語(yǔ)句進(jìn)行迭代并能正確地支持 len()
內置函數。
如果一個(gè) DOM 實(shí)現支持文檔的修改,則 NodeList
實(shí)現還必須支持 __setitem__()
和 __delitem__()
方法。
文檔類(lèi)型對象?
有關(guān)一個(gè)文檔所聲明的標注和實(shí)體的信息(包括解析器所使用并能提供信息的外部子集)可以從 DocumentType
對象獲取。 文檔的 DocumentType
可從 Document
對象的 doctype
屬性中獲??;如果一個(gè)文檔沒(méi)有 DOCTYPE
聲明,則該文檔的 doctype
屬性將被設為 None
而非此接口的一個(gè)實(shí)例。
DocumentType
是 Node
是專(zhuān)門(mén)化,并增加了下列屬性:
- DocumentType.publicId?
文檔類(lèi)型定義的外部子集的公有標識。 這將為一個(gè)字符串或者為
None
。
- DocumentType.systemId?
文檔類(lèi)型定義的外部子集的系統標識。 這將為一個(gè)字符串形式的 URI,或者為
None
。
- DocumentType.internalSubset?
一個(gè)給出來(lái)自文檔的完整內部子集的字符串。 這不包括子集外面的圓括號。 如果文檔沒(méi)有內部子集,則應為
None
。
- DocumentType.name?
DOCTYPE
聲明中給出的根元素名稱(chēng),如果有的話(huà)。
- DocumentType.entities?
這是給出外部實(shí)體定義的
NamedNodeMap
。 對于多次定義的實(shí)體名稱(chēng),則只提供第一次的定義(其他的會(huì )按照 XML 建議被忽略)。 這可能為None
,如果解析器未提供此信息,或者如果未定義任何實(shí)體的話(huà)。
- DocumentType.notations?
這是給出標注定義的
NamedNodeMap
。 對于多次定義的標注,則只提供第一次的定義(其他的會(huì )按照 XML 建議被忽略)。 這可能為None
,如果解析器未提供此信息,或者如果未定義任何標注的話(huà)。
Document 對象?
Document
代表一個(gè)完整的 XML 文檔,包括其組成元素、屬性、處理指令和注釋等。 請記住它會(huì )繼承來(lái)自 Node
的屬性。
- Document.documentElement?
文檔唯一的根元素。
- Document.createElement(tagName)?
創(chuàng )建并返回一個(gè)新的元素節點(diǎn)。 當元素被創(chuàng )建時(shí)不會(huì )被插入到文檔中。 你需要通過(guò)某個(gè)其他方法例如
insertBefore()
或appendChild()
來(lái)顯示地插入它。
- Document.createElementNS(namespaceURI, tagName)?
創(chuàng )建并返回一個(gè)新的帶有命名空間的元素。 tagName 可以帶有前綴。 當元素被創(chuàng )建時(shí)不會(huì )被插入到文檔中。 你需要通過(guò)某個(gè)其他方法例如
insertBefore()
或appendChild()
來(lái)顯式地插入它。
- Document.createTextNode(data)?
創(chuàng )建并返回一個(gè)包含作為形參被傳入的數據的文本節點(diǎn)。 與其他創(chuàng )建方法一樣,此方法不會(huì )將節點(diǎn)插入到樹(shù)中。
- Document.createComment(data)?
創(chuàng )建并返回一個(gè)包含作為形參被傳入的數據的注釋節點(diǎn)。 與其他創(chuàng )建方法一樣,此方法不會(huì )將節點(diǎn)插入到樹(shù)中。
- Document.createProcessingInstruction(target, data)?
創(chuàng )建并返回一個(gè)包含作為形參被傳入的 target 和 data 的處理指令節點(diǎn)。 與其他創(chuàng )建方法一樣,此方法不會(huì )將節點(diǎn)插入到樹(shù)中。
- Document.createAttribute(name)?
創(chuàng )建并返回一個(gè)屬性節點(diǎn)。 此方法不會(huì )將屬性節點(diǎn)關(guān)聯(lián)到任何特定的元素。 你必須在正確的
Element
對象上使用setAttributeNode()
來(lái)使用新創(chuàng )建的屬性實(shí)例。
- Document.createAttributeNS(namespaceURI, qualifiedName)?
創(chuàng )建并返回一個(gè)帶有命名空間的屬性節點(diǎn)。 tagName 可以帶有前綴。 此方法不會(huì )將屬性節點(diǎn)關(guān)聯(lián)到任何特定的元素。 你必須在正確的
Element
對象上使用setAttributeNode()
來(lái)使用新創(chuàng )建的屬性實(shí)例。
- Document.getElementsByTagName(tagName)?
搜索全部具有特定元素類(lèi)型名稱(chēng)的后繼元素(直接下級、下級的下級等等)。
- Document.getElementsByTagNameNS(namespaceURI, localName)?
搜索全部具有特定命名空間 URI 和 localname 的后繼元素(直接下級、下級的下級等等)。 localname 是命名空間在前綴之后的部分。
元素對象?
Element
是 Node
的子類(lèi),因此會(huì )繼承該類(lèi)的全部屬性。
- Element.tagName?
元素類(lèi)型名稱(chēng)。 在使用命名空間的文檔中它可能包含冒號。 該值是一個(gè)字符串。
- Element.getElementsByTagName(tagName)?
與
Document
類(lèi)中的對應方法相同。
- Element.getElementsByTagNameNS(namespaceURI, localName)?
與
Document
類(lèi)中的對應方法相同。
- Element.hasAttribute(name)?
如果元素帶有名稱(chēng)為 name 的屬性則返回
True
。
- Element.hasAttributeNS(namespaceURI, localName)?
如果元素帶有名稱(chēng)為 namespaceURI 加 localName 的屬性則返回
True
。
- Element.getAttribute(name)?
將名稱(chēng)為 name 的屬性的值作為字符串返回。 如果指定屬性不存在,則返回空字符串,就像該屬性沒(méi)有對應的值一樣。
- Element.getAttributeNode(attrname)?
返回名稱(chēng)為 attrname 的屬性對應的
Attr
節點(diǎn)。
- Element.getAttributeNS(namespaceURI, localName)?
將名稱(chēng)為 namespaceURI 加 localName 的屬性的值作為字符串返回。 如果指定屬性不存在,則返回空字符串,就像該屬性沒(méi)有對應的值一樣。
- Element.getAttributeNodeNS(namespaceURI, localName)?
將給定 namespaceURI 加 localName 的屬性的值作為節點(diǎn)返回。
- Element.removeAttribute(name)?
移除指定名稱(chēng)的節點(diǎn)。 如果沒(méi)有匹配的屬性,則會(huì )引發(fā)
NotFoundErr
。
- Element.removeAttributeNode(oldAttr)?
從屬性列表中移除并返回 oldAttr,如果該屬性存在的話(huà)。 如果 oldAttr 不存在,則會(huì )引發(fā)
NotFoundErr
。
- Element.removeAttributeNS(namespaceURI, localName)?
移除指定名稱(chēng)的屬性。 請注意它是使用 localName 而不是 qname。 如果沒(méi)有匹配的屬性也不會(huì )引發(fā)異常。
- Element.setAttribute(name, value)?
將屬性值設為指定的字符串。
- Element.setAttributeNode(newAttr)?
將一個(gè)新的屬性節點(diǎn)添加到元素,當匹配到
name
屬性時(shí)如有必要會(huì )替換現有的屬性。 如果發(fā)生了替換,將返回原有屬性節點(diǎn)。 如果 newAttr 已經(jīng)被使用,則會(huì )引發(fā)InuseAttributeErr
。
- Element.setAttributeNodeNS(newAttr)?
將一個(gè)新的屬性節點(diǎn)添加到元素,當匹配到
namespaceURI
和localName
屬性時(shí)如有必要會(huì )替換現有的屬性。 如果發(fā)生了替換,將返回原有屬性節點(diǎn)。 如果 newAttr 已經(jīng)被使用,則會(huì )引發(fā)InuseAttributeErr
。
- Element.setAttributeNS(namespaceURI, qname, value)?
將屬性值設為 namespaceURI 和 qname 所給出的字符串。 請注意 qname 是整個(gè)屬性名稱(chēng)。 這與上面的方法不同。
Attr 對象?
Attr
繼承自 Node
,因此會(huì )繼承其全部屬性。
- Attr.name?
屬性名稱(chēng)。 在使用命名空間的文檔中可能會(huì )包括冒號。
- Attr.localName?
名稱(chēng)在冒號之后的部分,如果有的話(huà),否則為完整名稱(chēng)。 這是個(gè)只讀屬性。
- Attr.prefix?
名稱(chēng)在冒號之前的部分,如果有冒號的話(huà),否則為空字符串。
- Attr.value?
屬性的文本值。 這與
nodeValue
屬性同義。
NamedNodeMap 對象?
NamedNodeMap
不是 繼承自 Node
。
- NamedNodeMap.length?
屬性列表的長(cháng)度。
- NamedNodeMap.item(index)?
返回特定帶有索引號的屬性。 獲取屬性的順序是強制規定的,但在 DOM 的生命期內會(huì )保持一致。 其中每一項均為屬性節點(diǎn)。 可使用
value
屬性獲取其值。
還有一些試驗性方法給予這個(gè)類(lèi)更多的映射行為。 你可以使用這些方法或者使用 Element
對象上標準化的 getAttribute*()
方法族。
Text 和 CDATASection 對象?
Text
接口代表 XML 文檔中的文本。 如果解析器和 DOM 實(shí)現支持 DOM 的 XML 擴展,則包裹在 CDATA 標記的節中的部分會(huì )被存儲到 CDATASection
對象中。 這兩個(gè)接口很相似,但是提供了不同的 nodeType
屬性值。
這些接口擴展了 Node
接口。 它們不能擁有下級節點(diǎn)。
- Text.data?
字符串形式的文本節點(diǎn)內容。
備注
CDATASection
節點(diǎn)的使用并不表示該節點(diǎn)代表一個(gè)完整的 CDATA 標記節,只是表示該節點(diǎn)的內容是 CDATA 節的一部分。 單個(gè) CDATA 節可以由文檔樹(shù)中的多個(gè)節點(diǎn)來(lái)表示。 沒(méi)有什么辦法能確定兩個(gè)相鄰的 CDATASection
節點(diǎn)是否代表不同的 CDATA 標記節。
ProcessingInstruction 對象?
代表 XML 文檔中的處理指令。 它繼承自 Node
接口并且不能擁有下級節點(diǎn)。
- ProcessingInstruction.target?
到第一個(gè)空格符為止的處理指令內容。 這是個(gè)只讀屬性。
- ProcessingInstruction.data?
在第一個(gè)空格符之后的處理指令內容。
異常?
DOM 第 2 層級推薦定義一個(gè)異常 DOMException
,以及多個(gè)變量用來(lái)允許應用程序確定發(fā)生了何種錯誤。 DOMException
實(shí)例帶有 code
屬性用來(lái)提供特定異常所對應的值。
Python DOM 接口提供了一些常量,但還擴展了異常集以使 DOM 所定義的每個(gè)異常代碼都存在特定的異常。 接口的具體實(shí)現必須引發(fā)正確的特定異常,它們各自帶有正確的 code
屬性值。
- exception xml.dom.DOMException?
所有特定 DOM 異常所使用的異?;?lèi)。 該異常類(lèi)不可被直接實(shí)例化。
- exception xml.dom.DomstringSizeErr?
當指定范圍的文本不能適配一個(gè)字符串時(shí)被引發(fā)。 此異常在 Python DOM 實(shí)現中尚不可用,但可從不是以 Python 編寫(xiě)的 DOM 實(shí)現中接收。
- exception xml.dom.HierarchyRequestErr?
當嘗試插入一個(gè)節點(diǎn)但該節點(diǎn)類(lèi)型不被允許時(shí)被引發(fā)。
- exception xml.dom.IndexSizeErr?
當一個(gè)方法的索引或大小參數為負值或超出允許的值范圍時(shí)被引發(fā)。
- exception xml.dom.InuseAttributeErr?
當嘗試插入一個(gè)
Attr
節點(diǎn)但該節點(diǎn)已存在于文檔中的某處時(shí)被引發(fā)。
- exception xml.dom.InvalidAccessErr?
當某個(gè)參數或操作在底層對象中不受支持時(shí)被引發(fā)。
- exception xml.dom.InvalidCharacterErr?
當某個(gè)字符串參數包含的字符在使用它的上下文中不被 XML 1.0 標準建議所允許時(shí)引發(fā)。 例如,嘗試創(chuàng )建一個(gè)元素類(lèi)型名稱(chēng)中帶有空格的
Element
節點(diǎn)將導致此錯誤被引發(fā)。
- exception xml.dom.InvalidModificationErr?
當嘗試修改某個(gè)節點(diǎn)的類(lèi)型時(shí)被引發(fā)。
- exception xml.dom.InvalidStateErr?
當嘗試使用未定義或不再可用的的對象時(shí)被引發(fā)。
- exception xml.dom.NamespaceErr?
如果試圖以 XML 中的命名空間 建議所不允許的方式修改任何對象,則會(huì )引發(fā)此異常。
- exception xml.dom.NotFoundErr?
當某個(gè)節點(diǎn)不存在于被引用的上下文中時(shí)引發(fā)的異常。 例如,
NamedNodeMap.removeNamedItem()
將在所傳入的節點(diǎn)不在于于映射中時(shí)引發(fā)此異常。
- exception xml.dom.NotSupportedErr?
當具體實(shí)現不支持所請求的對象類(lèi)型或操作時(shí)被引發(fā)。
- exception xml.dom.NoDataAllowedErr?
當為某個(gè)不支持數據 的節點(diǎn)指定數據時(shí)被引發(fā)。
- exception xml.dom.NoModificationAllowedErr?
當嘗試修改某個(gè)不允許修改的對象(例如只讀節點(diǎn))時(shí)被引發(fā)。
- exception xml.dom.SyntaxErr?
當指定了無(wú)效或非法的字符串時(shí)被引發(fā)。
- exception xml.dom.WrongDocumentErr?
當將某個(gè)節點(diǎn)插入非其當前所屬的另一個(gè)文檔,并且具體實(shí)現不支持從一個(gè)文檔向一個(gè)文檔遷移節點(diǎn)時(shí)被引發(fā)。
DOM 建議映射中針對上述異常而定義的異常代碼如下表所示:
常量 |
異常 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
一致性?
本節描述了 Python DOM API、W3C DOM 建議以及 Python 的 OMG IDL 映射之間的一致性要求和關(guān)系。
類(lèi)型映射?
將根據下表,將DOM規范中使用的IDL類(lèi)型映射為Python類(lèi)型。
IDL 類(lèi)型 |
Python 類(lèi)型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
訪(fǎng)問(wèn)器方法?
從 OMG IDL 到 Python 的映射以類(lèi)似于 Java 映射的方式定義了針對 IDL attribute
聲明的訪(fǎng)問(wèn)器函數。 映射以下 IDL 聲明
readonly attribute string someValue;
attribute string anotherValue;
會(huì )產(chǎn)生三個(gè)訪(fǎng)問(wèn)器函數: someValue
的 "get" 方法 (_get_someValue()
),以及 anotherValue
的 "get" 和 "set" 方法 (_get_anotherValue()
和 _set_anotherValue()
)。 特別地,該映射不要求 IDL 屬性像普通 Python 屬性那樣可訪(fǎng)問(wèn): object.someValue
并非 必須可用,并可能引發(fā) AttributeError
。
但是,Python DOM API 則 確實(shí) 要求普通屬性訪(fǎng)問(wèn)可用。 這意味著(zhù)由 Python IDL 解譯器生成的典型代理有可能會(huì )不可用,如果 DOM 對象是通過(guò) CORBA 來(lái)訪(fǎng)問(wèn)則在客戶(hù)端可能需要有包裝對象。 雖然這確實(shí)要求為 CORBA DOM 客戶(hù)端進(jìn)行額外的考慮,但具有從 Python 通過(guò) CORBA 使用 DOM 經(jīng)驗的實(shí)現并不會(huì )認為這是個(gè)問(wèn)題。 已經(jīng)聲明了 readonly
的屬性不必在所有 DOM 實(shí)現中限制寫(xiě)入訪(fǎng)問(wèn)。
在 Python DOM API 中,訪(fǎng)問(wèn)器函數不是必須的。 如果提供,則它們應當采用由 Python IDL 映射所定義的形式,但這些方法會(huì )被認為不必要,因為這些屬性可以從 Python 直接訪(fǎng)問(wèn)。 永遠都不要為 readonly
屬性提供 "set" 訪(fǎng)問(wèn)器。
IDL 定義沒(méi)有完全體現 W3C DOM API 的要求,如特定對象的概念,又如 getElementsByTagName()
的返回值為 "live" 等。 Python DOM API 并不強制具體實(shí)現執行這些要求。
注釋對象?
Comment
代表 XML 文檔中的注釋。 它是Node
的子類(lèi),但不能擁有下級節點(diǎn)。注釋的內容是一個(gè)字符串。 該屬性包含在開(kāi)頭
<!-
-
和末尾-
->
之間的所有字符,但不包括這兩個(gè)符號。