文件物件模型,或者“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返回。如果refChildNone
,它的末尾插入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
物件。
文字和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
評論的物件
Comment
代表一個評論在XML文件。它的一個子類Node
,但不能有子節點。Comment.
data
評論的內容為字串。領導之間的屬性包含所有字元
<!-
-
和落後-
->
,但不包括他們。