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