xml.dom——文件物件模型API

xie仗劍天涯發表於2017-04-20

文件物件模型,或者“DOM”,是一個跨語言API的World Wide Web Consortium(W3C)來訪問和修改XML文件。DOM的實現提供了一個XML文件樹結構,或允許客戶機程式碼從頭開始建立這樣一個結構。然後給訪問結構通過一組物件提供著名的介面。

 

模組內容

xml.dom包含以下功能:

xml.dom.registerDOMImplementation(name,factory)

註冊factory函式名稱的名稱。factory函式應該返回一個物件實現 DOMImplementation介面。factory函式可以返回相同的物件,或為每個呼叫一個新的,適合特定的實現(例如,如果該實現支援一些定製)。

xml.dom.getDOMImplementation(name =None,features=())

返回一個合適的DOM實現。這個名字是眾所周知,DOM實現的模組名稱,或者 None。如果它不是 None,進口並返回相應的模組 DOMImplementation如果匯入成功。如果沒有名字,如果環境變數 PYTHON_DOM設定,該變數用於找到實現。

如果名字不是給定的,這個檢查可用的實現找到所需的特性。如果沒有實現可以被發現,增加一個 ImportError。的功能列表必須是一個序列(feature, version)對傳遞到 hasFeature()方法可用 DOMImplementation物件。

還提供了一些方便的常量:

xml.dom.EMPTY_NAMESPACE

沒有名稱空間的值用來表示與DOM節點。這通常是發現的 namespaceURI一個節點,或者用作namespaceURI namespaces-specific方法引數。

xml.dom.XML_NAMESPACE

保留字首的名稱空間URI xml所定義的XML名稱空間(第四節)。

xml.dom.XMLNS_NAMESPACE

定義的名稱空間宣告的名稱空間URI文件物件模型(DOM)二級核心規範(部分1.1.8)。

xml.dom.XHTML_NAMESPACE

XHTML名稱空間的URI所定義的XHTML 1.0:可擴充套件超文字標記語言(3.1.1節)。

此外, xml.dom包含一個基地 Node類和DOM異常類。的 Node這個模組提供的類沒有實現任何方法或屬性定義為DOM規範;混凝土DOM實現必須提供這些。的 Node類提供這個模組提供使用的常量 nodeType在具體的屬性 Node物件,它們位於類而不是在模組級別符合DOM規範。

DOM中的物件

的文件DOM從W3C DOM規範。

注意,也可以操縱DOM屬性節點,而不是簡單的字串。這是相當罕見的,你必須這樣做,然而,這個用法是沒有記錄的。

介面部分目的
DOMImplementation DOMImplementation物件 介面底層實現。
Node 節點物件 基地的大多數物件介面文件。
NodeList 節點列表物件 介面節點序列。
DocumentType DocumentType物件 關於宣告過程文件所需的資訊。
Document 文件物件 物件代表一���完整的文件。
Element 元素物件 文件中的元素節點的層次結構。
Attr Attr物件 屬性值節點元素節點。
Comment 評論的物件 源文件中表示的評論。
Text 文字和CDATASection物件 從文件中包含文字內容的節點。
ProcessingInstruction ProcessingInstruction物件 處理指令的表示。

一個額外的部分描述定義的異常處理DOM在Python中。

DOMImplementation物件

 DOMImplementation介面應用程式提供了一種方法來確定特定功能的可用性在DOM中使用。DOM級別2新增建立新的能力 Document DocumentType物件的使用 DOMImplementation

DOMImplementation.hasFeature(特性,版本)

返回true,如果特性由一對字串標識功能和版本實現。

DOMImplementation.createDocument(namespaceUri qualifiedName,文件型別)

返回一個新的 Document物件(DOM)的根源,一個孩子 Element物件在給定namespaceUri和qualifiedName。文件型別必須是一個 DocumentType建立的物件 createDocumentType(),或 None。在Python DOM API,前兩個引數也可以 None為了表明沒有 Element孩子是要建立。

DOMImplementation.createDocumentType(qualifiedName publicId,systemId)

返回一個新的 DocumentType物件,該物件封裝了給定qualifiedName publicId,systemId字串,表示XML文件型別宣告中包含的資訊。

節點物件

XML文件的所有元件的子類 Node.

Node.nodeType

一個整數代表節點型別。符號常量的型別 Node物件: ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, CDATA_SECTION_NODE, ENTITY_NODE,PROCESSING_INSTRUCTION_NODE, COMMENT_NODE, DOCUMENT_NODE, DOCUMENT_TYPE_NODE, NOTATION_NODE。這是一個只讀屬性。

Node.parentNode

當前節點的父,或 None文件節點。始終是一個價值 Node物件或 None。為 Element節點,這將是父元素,除了根元素,在這種情況下,這將是 Document物件。為 Attr節點,這總是 None。這是一個只讀屬性。

Node.attributes

一個 NamedNodeMap物件的屬性。只有元素實際值;其他人提供 None這個屬性。這是一個只讀屬性。

Node.previousSibling

立即的節點之前這一相同的父母。例如元素結束標記之前自我元素的開始標記。當然,不僅僅是元素的XML文件是由所以前面的兄弟姐妹可以是文字、註釋,或者其他東西。如果這個節點是父母的第一個孩子,這個屬性 None。這是一個只讀屬性。

Node.nextSibling

節點立即遵循這一相同的父母。另請參閱 previousSibling。如果這是最後一個孩子的家長,這個屬性 None。這是一個只讀屬性。

Node.childNodes

包含在這個節點的節點列表。這是一個只讀屬性。

Node.firstChild

的第一個子節點,如果有任何,或 None。這是一個只讀屬性。

Node.lastChild

的最後一個孩子節點,如果有任何,或 None。這是一個只讀屬性。

Node.localName

的部分 tagName冒號後如果有一個,否則整個 tagName。值是一個字串。

Node.prefix

的部分 tagName冒號前如果有一個,其他的空字串。值是一個字串,或 None.

Node.namespaceURI

名稱空間相關聯的元素名稱。這將是一個字串或 None。這是一個只讀屬性。

Node.nodeName

這為每個節點型別都有不同的意義;有關詳細資訊,請參閱DOM規範。你總是可以得到的資訊會從另一個屬性等 tagName屬性或元素 name屬性的屬性。對於所有的節點型別,該屬性的值將一個字串或 None。這是一個只讀屬性。

Node.nodeValue

這為每個節點型別都有不同的意義;有關詳細資訊,請參閱DOM規範。這種情況是類似的 nodeName。該值是一個字串 None.

Node.hasAttributes()

如果節點有任何屬性返回true。

Node.hasChildNodes()

如果節點有子節點返回true。

Node.isSameNode(其他)

返回true,如果其他指的是相同的節點,這個節點。這是特別有用的DOM實現,使用任何形式的代理體系結構(因為超過一個物件可以引用相同的節點)。

請注意

這是提出基於DOM Level 3 API仍然在“工作草案”階段,但這個特殊的介面出現爭議。改變從W3C不一定會影響這種方法在Python DOM介面(儘管任何新的W3C API也會支援)。

Node.appendChild(newChild)

新增一個新的子節點,該節點的孩子的列表,返回newChild。如果節點已經在樹上,它首先被移除。

Node.insertBefore(newChild,refChild)

現有的孩子之前插入一個新的子節點。必須這樣,refChild是該節點的孩子;如果不是, ValueError是提高。newChild返回。如果refChild None,它的末尾插入newChild兒童名單。

Node.removeChild(oldChild)

刪除一個子節點。oldChild必須該節點的孩子;如果不是, ValueError是提高。oldChild成功返回。如果oldChild不會進一步使用,其 unlink()方法應該呼叫。

Node.replaceChild(newChild,oldChild)

用一個新節點替換現有的節點。必須這樣,oldChild是該節點的孩子;如果不是, ValueError是提高。

Node.normalize()

連線相鄰的文字節點,這樣所有的文字被儲存為單身 Text例項。這種簡化處理文字從DOM樹對於許多應用程式。

Node.cloneNode()

克隆這個節點。設定深度意味著克隆所有子節點。這返回克隆。

節點列表物件

一個 NodeList代表一個節點序列。使用這些物件以兩種方式在DOM核心推薦:一個 Element物件提供了一個作為它的子節點列表,和getElementsByTagName() getElementsByTagNameNS()的方法 Node返回查詢結果物件與該介面表示。

DOM級別2建議為這些物件定義一個方法和一個屬性:

NodeList.item()

返回第i個項的序列,如果有一個,或者 None。指標我不允許小於零個或大於或等於序列的長度。

NodeList.length

的節點數量的序列。

此外,Python DOM介面要求提供了一些額外的支援允許 NodeList作為Python物件序列。所有 NodeList實現必須包括支援 __len__() __getitem__()這允許迭代 NodeList for語句和適當的支援 len()內建函式。

如果一個DOM實現支援文件的修改, NodeList實現也必須支援 __setitem__() __delitem__()方法。

DocumentType物件

的資訊符號和實體宣告的檔案(包括外部子集如果解析器使用它,可以提供資訊)從一個可用 DocumentType物件。的 DocumentType可以從一個文件Document物件的 doctype屬性,如果沒有 DOCTYPE宣言的文件,文件的 doctype屬��將被設定為 None而不是這個介面的一個例項。

DocumentType是一個專業化的 Node,並新增以下屬性:

DocumentType.publicId

外部的公共標識文件型別定義的子集。這將是一個字串或 None.

DocumentType.systemId

系統識別符號的外部文件型別定義的子集。這將是一個URI作為字串,或 None.

DocumentType.internalSubset

一個字串從文件中提供完整的內部子集。這個不包括括號附上子集。如果文件沒有內部子集,這應該是 None.

DocumentType.name

根元素的名稱了 DOCTYPE宣告,如果存在。

DocumentType.entities

這是一個 NamedNodeMap給外部實體的定義。不止一次定義的實體名稱,只有第一個定義提供所需的(忽略其他XML推薦)。這可能是 None如果沒有提供的資訊解析器,或如果沒有實體的定義。

DocumentType.notations

這是一個 NamedNodeMap符號的定義。符號名稱定義不止一次,只提供第一個定義(忽略其他XML推薦)的要求。這可能是 None如果沒有提供的資訊解析器,或如果沒有定義的符號。

文件物件

一個 Document代表整個XML文件,包括它的組成元素、屬性、處理指令、註釋等等。請記住,它繼承屬性 Node.

Document.documentElement

唯一的文件的根元素。

Document.createElement(tagName)

建立並返回一個新的元素節點。元素沒有插入到文件時建立的。您需要顯式地插入等其他方法之一 insertBefore() appendChild().

Document.createElementNS(namespaceURI,tagName)

建立並返回一個新元素和一個名稱空間。tagName可能有一個字首。元素沒有插入到文件時建立的。您需要顯式地插入等其他方法之一insertBefore() appendChild().

Document.createTextNode(資料)

建立並返回一個包含資料作為引數傳遞的文字節點。與其他建立方法,這個不將節點插入到樹中。

Document.createComment(資料)

建立並返回一個包含資料作為引數傳遞的註釋節點。與其他建立方法,這個不將節點插入到樹中。

Document.createProcessingInstruction(目標,資料)

建立並返回一個包含目標和��據處理指令節點作為引數傳遞。與其他建立方法,這個不將節點插入到樹中。

Document.createAttribute(的名字)

建立並返回一個屬性節點。這種方法不與任何特定元素關聯屬性節點。你必須使用 setAttributeNode()在適當的 Element使用新建立的屬性例項物件。

Document.createAttributeNS(namespaceURI,qualifiedName)

建立並返回一個與一個名稱空間屬性節點。tagName可能有一個字首。這種方法不與任何特定元素關聯屬性節點。你必須使用 setAttributeNode()在適當的 Element使用新建立的屬性例項物件。

Document.getElementsByTagName(tagName)

搜尋所有的後代(直接的孩子,孩子的孩子,等等)與一個特定的元素型別名。

Document.getElementsByTagNameNS(namespaceURI,localName)

搜尋所有的後代(直接的孩子,孩子的孩子,等等)與一個特定的名稱空間URI和localname。localname是名稱空間字首後的一部分。

元素物件

Element是一個子類 Node,所以繼承這個類的所有屬性。

Element.tagName

元素型別名。在使用文件,它可能有冒號。值是一個字串。

Element.getElementsByTagName(tagName)

與等效方法相��� Document類。

Element.getElementsByTagNameNS(namespaceURI,localName)

與等效方法相��� Document類。

Element.hasAttribute(的名字)

返回true,如果元素有一個屬性的名字命名。

Element.hasAttributeNS(namespaceURI,localName)

返回true,如果由namespaceURI和localName元素有一個屬性命名。

Element.getAttribute(的名字)

返回該屬性的值指定的名字作為一個字串。如果沒有這樣的屬性存在,則返回一個空字串,如果屬性沒有價值。

Element.getAttributeNode(attrname)

返回 Attr被attrname節點的屬性。

Element.getAttributeNS(namespaceURI,localName)

返回屬性的值被namespaceURI和localName為字串。如果沒有這樣的屬性存在,則返回一個空字串,如果屬性沒有價值。

Element.getAttributeNodeNS(namespaceURI,localName)

返回屬性值作為一個節點,namespaceURI和localName。

Element.removeAttribute(的名字)

刪除一個屬性的名字。如果沒有匹配的屬性,一個 NotFoundErr是提高。

Element.removeAttributeNode(oldAttr)

刪除並返回oldAttr屬性列表,如果存在。如果oldAttr不存在, NotFoundErr是提高。

Element.removeAttributeNS(namespaceURI,localName)

刪除一個屬性的名字。注意,它使用一個localName,不是一個qname。不例外是���果沒有匹配的屬性。

Element.setAttribute(的名字,價值)

從一個字串設定一個屬性值。

Element.setAttributeNode(newAttr)

新增一個新的屬性節點元素,取代現有的屬性如果必要的 name屬性匹配。如果發生更換,舊的屬性節點將被歸還。如果newAttr已經被使用,InuseAttributeErr將會提高。

Element.setAttributeNodeNS(newAttr)

新增一個新的屬性節點元素,取代現有的屬性如果必要的 namespaceURI localName屬性匹配。如果發生更換,舊的屬性節點將被歸還。如果newAttr已經被使用, InuseAttributeErr將會提高。

Element.setAttributeNS(namespaceURI qname,價值)

設定一個屬性值從一個字串,namespaceURI和qname。注意,qname是整個屬性名稱。這是不同的。

Attr物件

Attr繼承自 Node,所以繼承了它的所有屬性。

Attr.name

屬性名稱。在使用文件,它可能包含一個冒號。

Attr.localName

冒號後的名稱的一部分,如果有一個,其他的整個名字。這是一個只讀屬性。

Attr.prefix

冒號前的名字的一部分,如果有一個,其他的空字串。

Attr.value

屬性的文字值。這是一個同義詞 nodeValue屬性。

NamedNodeMap物件

NamedNodeMap不繼承 Node.

NamedNodeMap.length

屬性列表的長度。

NamedNodeMap.item(指數)

返回一個與特定索引的屬性。訂單得到屬性是任意但將為DOM的生活是一致的。每個條目是一個屬性節點。獲得它的價值的 value屬性。

也有一些實驗方法,給這門課更多的對映行為。您可以使用它們,或者你可以使用標準化 getAttribute*()家庭的方法 Element物件。

評論的物件

Comment代表一個評論在XML文件。它的一個子類 Node,但不能有子節點。

Comment.data

評論的內容為字串。領導之間的屬性包含所有字元 <!--和落後 -->,但不包括他們。

文字和CDATASection物件

 Text介面表示XML文件中的文字。如果解析器和DOM實現支援DOM的XML擴充套件的部分文字儲存在封閉在CDATA部分 CDATASection物件。這兩個介面是相同的,但提供不同的值 nodeType屬性。

這些介面擴充套件 Node介面。他們不能有子節點。

Text.data

文字節點的內容為字串。

請注意

的使用 CDATASection節點並不表明,節點代表一個完整的CDATA標記部分,只有節點的內容是一個CDATA區域的一部分。一個CDATA區域可能是由多個節點在文件樹中。沒有辦法確定是否兩個相鄰 CDATASection節點代表不同的CDATA標記部分。

ProcessingInstruction物件

代表了XML文件的處理指令,這繼承的 Node介面和不能有子節點。

ProcessingInstruction.target

處理指令的內容,第一個空格字元。這是一個只讀屬性。

ProcessingInstruction.data

處理指令的內容後第一個空格字元。

異常

DOM級別2建議定義了一個例外, DOMException和一些常量,允許應用程式以確定什麼樣的錯誤發生。 DOMException攜帶一個例項 code提供適當的值的屬性為特定的例外。

Python DOM介面提供了常數,也擴充套件了組異常這樣一個特定的異常存在的異常程式碼定義的DOM。實現必須提高適當的具體的例外,每一個都有適當的值code屬性。

異常 xml.dom.DOMException

基地異常類用於所有特定的DOM例外。這個異常類不能直接例項化。

異常 xml.dom.DomstringSizeErr

長大當一個指定範圍的文字不符合一個字串。這不是在Python中使用DOM實現,但不可能收到DOM實現用Python編寫的。

異常 xml.dom.HierarchyRequestErr

提出當試圖插入一個節點,節點型別是不允許的。

異常 xml.dom.IndexSizeErr

提出當索引或尺寸引數方法是-或超過允許的值。

異常 xml.dom.InuseAttributeErr

當試圖插入一個 Attr節點已經存在其他文件。

異常 xml.dom.InvalidAccessErr

提出瞭如果一個引數或操作不支援在底層物件。

異常 xml.dom.InvalidCharacterErr

這個異常是長大當一個字串引數包含一個字元,是不允許在XML 1.0中使用的建議。例如,試圖建立一個 Element節點型別名稱空間的元素將導致這個錯誤。

異常 xml.dom.InvalidModificationErr

提出當試圖修改一個節點的型別。

異常 xml.dom.InvalidStateErr

提出當試圖使用一個物件,沒有定義或不再可用。

異常 xml.dom.NamespaceErr

如果試圖改變任何物件的方式是不允許的XML名稱空間建議,這個異常。

異常 xml.dom.NotFoundErr

不存在例外,當一個節點引用的上下文。例如, NamedNodeMap.removeNamedItem()會提高如果節點通過在地圖上並不存在。

異常 xml.dom.NotSupportedErr

提出實現時不支援請求的型別的物件或操作。

異常 xml.dom.NoDataAllowedErr

這是提高如果指定資料的節點不支援資料。

異常 xml.dom.NoModificationAllowedErr

在試圖修改一個物件,不允許修改(比如對於只讀節點)。

異常 xml.dom.SyntaxErr

長大當一個無效或非法指定字串。

異常 xml.dom.WrongDocumentErr

長大當一個節點插入比目前屬於一個不同的文件,和實現不支援遷移的節點從一個文件移到另一個。

異常程式碼中定義的對映到DOM建議上述例外情況根據這個表:

常數異常
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

一致性

本節描述的一致性要求和Python DOM API之間的關係,W3C DOM的建議,和Python的OMG IDL對映。

型別對映

DOM規範中使用的IDL型別被對映到Python型別根據下表。

IDL型別Python型別
boolean bool int
int int
long int int
unsigned int int
DOMString str bytes
null None

訪問器方法

從OMG IDL對映到Python IDL定義訪問器函式 attribute宣告的Java對映方式。將IDL對映宣告

readonlyattributestringsomeValue;attributestringanotherValue;

收益率三個訪問器功能:“獲得”的方法 someValue (_get_someValue()),“得到”和“組”的方法 anotherValue (_get_anotherValue()_set_anotherValue())。特別是對映,不要求IDL屬性可以正常訪問Python屬性: object.someValue不需要工作,可以提高一個嗎 AttributeError.

然而,Python DOM API並要求正常屬性訪問工作。這意味著Python IDL編譯器生成的典型的代理不可能去工作,和包裝器物件可能需要在客戶端如果通過CORBA訪問DOM物件。雖然這確實需要一些額外的考慮CORBA DOM客戶,Python的實現者使用DOM在CORBA與經驗不考慮這一個問題。屬性聲��� readonly不得限制在所有DOM實現寫訪問。

在Python DOM API,訪問器功能不需要。如果提供,他們應該採取的形式定義的Python IDL對映,但這些方法被認為是不必要的,因為可直接從Python的屬性。“套”訪問器不應提供 readonly屬性。

IDL定義不充分體現W3C DOM API的要求,如某些物件的概念,如的返回值 getElementsByTagName(),“活”。Python DOM API不需要執行這些要求的實現。

 

參考: https://docs.python.org/3/library/xml.dom.html

 

相關文章