xml.dom --- 文檔對(duì)象模型 API?

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


文檔對(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ě)入文檔。

接口

部件

目的

DOMImplementation

DOMImplementation 對(duì)象

底層實(shí)現(xiàn)的接口。

Node

節(jié)點(diǎn)對(duì)象

文檔中大多數(shù)對(duì)象的基本接口。

NodeList

節(jié)點(diǎn)列表對(duì)象

節(jié)點(diǎn)序列的接口。

DocumentType

文檔類型對(duì)象

有關(guān)處理文檔所需聲明的信息。

Document

Document 對(duì)象

表示整個(gè)文檔的對(duì)象。

Element

元素對(duì)象

文檔層次結(jié)構(gòu)中的元素節(jié)點(diǎn)。

Attr

Attr 對(duì)象

元素節(jié)點(diǎn)上的屬性值節(jié)點(diǎn)。

Comment

注釋對(duì)象

源文檔中注釋的表示形式。

Text

Text 和 CDATASection 對(duì)象

包含文檔中文本內(nèi)容的節(jié)點(diǎn)。

ProcessingInstruction

ProcessingInstruction 對(duì)象

處理指令表示形式。

描述在 Python 中使用 DOM 定義的異常的小節(jié)。

DOMImplementation 對(duì)象?

DOMImplementation 接口提供了一種讓?xiě)?yīng)用程序確定他們所使用的 DOM 中某一特性可用性的方式。 DOM 第 2 級(jí)還添加了使用 DOMImplementation 來(lái)創(chuàng)建新的 DocumentDocumentType 對(duì)象的能力。

DOMImplementation.hasFeature(feature, version)?

如果字符串對(duì) featureversion 所標(biāo)識(shí)的特性已被實(shí)現(xiàn)則返回 True。

DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)?

返回一個(gè)新的 Document 對(duì)象 (DOM 的根節(jié)點(diǎn)),包含一個(gè)具有給定 namespaceUriqualifiedName 的下級(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, publicIdsystemId 字符串的 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ì)被返回。 如果 refChildNone,它會(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)列表,以及由 NodegetElementsByTagName()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í)例。

DocumentTypeNode 是專門(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è)包含作為形參被傳入的 targetdata 的處理指令節(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ì)象?

ElementNode 的子類,因此會(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)?

如果元素帶有名稱為 namespaceURIlocalName 的屬性則返回 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)?

將名稱為 namespaceURIlocalName 的屬性的值作為字符串返回。 如果指定屬性不存在,則返回空字符串,就像該屬性沒(méi)有對(duì)應(yīng)的值一樣。

Element.getAttributeNodeNS(namespaceURI, localName)?

將給定 namespaceURIlocalName 的屬性的值作為節(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)匹配到 namespaceURIlocalName 屬性時(shí)如有必要會(huì)替換現(xiàn)有的屬性。 如果發(fā)生了替換,將返回原有屬性節(jié)點(diǎn)。 如果 newAttr 已經(jīng)被使用,則會(huì)引發(fā) InuseAttributeErr。

Element.setAttributeNS(namespaceURI, qname, value)?

將屬性值設(shè)為 namespaceURIqname 所給出的字符串。 請(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*() 方法族。

注釋對(duì)象?

Comment 代表 XML 文檔中的注釋。 它是 Node 的子類,但不能擁有下級(jí)節(jié)點(diǎn)。

Comment.data?

注釋的內(nèi)容是一個(gè)字符串。 該屬性包含在開(kāi)頭 <!-- 和末尾 --> 之間的所有字符,但不包括這兩個(gè)符號(hào)。

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ì)上述異常而定義的異常代碼如下表所示:

常量

異常

DOMSTRING_SIZE_ERR

DomstringSizeErr

HIERARCHY_REQUEST_ERR

HierarchyRequestErr

INDEX_SIZE_ERR

IndexSizeErr

INUSE_ATTRIBUTE_ERR

InuseAttributeErr

INVALID_ACCESS_ERR

InvalidAccessErr

INVALID_CHARACTER_ERR

InvalidCharacterErr

INVALID_MODIFICATION_ERR

InvalidModificationErr

INVALID_STATE_ERR

InvalidStateErr

NAMESPACE_ERR

NamespaceErr

NOT_FOUND_ERR

NotFoundErr

NOT_SUPPORTED_ERR

NotSupportedErr

NO_DATA_ALLOWED_ERR

NoDataAllowedErr

NO_MODIFICATION_ALLOWED_ERR

NoModificationAllowedErr

SYNTAX_ERR

SyntaxErr

WRONG_DOCUMENT_ERR

WrongDocumentErr

一致性?

本節(jié)描述了 Python DOM API、W3C DOM 建議以及 Python 的 OMG IDL 映射之間的一致性要求和關(guān)系。

類型映射?

將根據(jù)下表,將DOM規(guī)范中使用的IDL類型映射為Python類型。

IDL 類型

Python 類型

boolean

boolint

int

int

long int

int

unsigned int

int

DOMString

strbytes

null

None

訪問(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í)行這些要求。