xml.dom — 文件物件模型 API

原始碼: Lib/xml/dom/__init__.py


文件物件模型,或“DOM”,是全球資訊網聯盟 (W3C) 提供的跨語言 API,用於訪問和修改 XML 文件。DOM 實現將 XML 文件表示為樹結構,或者允許客戶端程式碼從頭構建這樣的結構。然後,它透過一組提供眾所周知的介面的物件來訪問該結構。

DOM 對於隨機訪問應用程式非常有用。SAX 只允許您一次檢視文件的一小部分。如果您正在檢視一個 SAX 元素,則無法訪問另一個元素。如果您正在檢視一個文字節點,則無法訪問包含元素。當您編寫 SAX 應用程式時,您需要在自己的程式碼中跟蹤程式在文件中的位置。SAX 不會為您執行此操作。此外,如果您需要在 XML 文件中向前看,那您就倒黴了。

某些應用程式在事件驅動模型中根本不可能實現,因為無法訪問樹。當然,您可以在 SAX 事件中自己構建某種樹,但 DOM 允許您避免編寫該程式碼。DOM 是 XML 資料的標準樹表示形式。

文件物件模型正由 W3C 分階段或在其術語中為“級別”進行定義。API 的 Python 對映主要基於 DOM Level 2 建議。

DOM 應用程式通常從將一些 XML 解析為 DOM 開始。DOM Level 1 完全沒有涵蓋如何完成此操作,並且 Level 2 僅提供了有限的改進:存在一個 DOMImplementation 物件類,該類提供對 Document 建立方法的訪問,但沒有以獨立於實現的方式訪問 XML 讀取器/解析器/文件構建器的方法。在沒有現有 Document 物件的情況下,也沒有定義明確的方法來訪問這些方法。在 Python 中,每個 DOM 實現都會提供一個函式 getDOMImplementation()。DOM Level 3 添加了一個載入/儲存規範,該規範定義了讀取器的介面,但此規範尚未在 Python 標準庫中提供。

擁有 DOM 文件物件後,您可以透過其屬性和方法訪問 XML 文件的各個部分。這些屬性在 DOM 規範中定義;本參考手冊的這一部分描述了規範在 Python 中的解釋。

W3C 提供的規範定義了 Java、ECMAScript 和 OMG IDL 的 DOM API。此處定義的 Python 對映主要基於規範的 IDL 版本,但不需要嚴格遵守(儘管實現可以自由支援來自 IDL 的嚴格對映)。有關對映要求的詳細討論,請參見 一致性 部分。

另請參閱

文件物件模型 (DOM) Level 2 規範

Python DOM API 基於的 W3C 建議。

文件物件模型 (DOM) Level 1 規範

xml.dom.minidom 支援的 DOM 的 W3C 建議。

Python 語言對映規範

這指定了從 OMG IDL 到 Python 的對映。

模組內容

xml.dom 包含以下函式

xml.dom.registerDOMImplementation(name, factory)

使用名稱 name 註冊 factory 函式。factory 函式應返回一個實現 DOMImplementation 介面的物件。factory 函式可以每次返回相同的物件,也可以每次呼叫返回一個新的物件,這取決於具體的實現(例如,如果該實現支援某些自定義)。

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

返回合適的 DOM 實現。name 是眾所周知的,DOM 實現的模組名稱或 None。如果不是 None,則匯入相應的模組,如果匯入成功,則返回一個 DOMImplementation 物件。如果未指定名稱,並且如果設定了環境變數 PYTHON_DOM,則使用此變數來查詢實現。

如果未給出名稱,則檢查可用的實現以查詢具有所需功能集的實現。如果找不到任何實現,則引發 ImportError。features 列表必須是傳遞給可用 DOMImplementation 物件上的 hasFeature() 方法的 (feature, version) 對的序列。

還提供了一些方便的常量

xml.dom.EMPTY_NAMESPACE

用於指示 DOM 中沒有名稱空間與節點關聯的值。這通常作為節點的 namespaceURI 找到,或者用作名稱空間特定方法的 namespaceURI 引數。

xml.dom.XML_NAMESPACE

與保留字首 xml 關聯的名稱空間 URI,如 XML 中的名稱空間(第 4 節)中所定義。

xml.dom.XMLNS_NAMESPACE

名稱空間宣告的名稱空間 URI,如 文件物件模型 (DOM) Level 2 Core 規範(第 1.1.8 節)中所定義。

xml.dom.XHTML_NAMESPACE

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

此外,xml.dom 包含一個基礎的 Node 類和 DOM 異常類。此模組提供的 Node 類不實現 DOM 規範定義的任何方法或屬性;具體的 DOM 實現必須提供這些。作為此模組一部分提供的 Node 類確實提供了用於具體 Node 物件上 nodeType 屬性的常量;為了符合 DOM 規範,它們位於類中而不是模組級別。

DOM 中的物件

DOM 的權威文件是 W3C 的 DOM 規範。

請注意,DOM 屬性也可以作為節點而不是簡單的字串進行操作。 但是,您很少需要這樣做,因此此用法尚未記錄。

介面

章節

目的

DOMImplementation

DOMImplementation 物件

底層實現的介面。

Node

Node 物件

文件中大多數物件的基本介面。

NodeList

NodeList 物件

節點序列的介面。

DocumentType

DocumentType 物件

關於處理文件所需的宣告的資訊。

Document

Document 物件

表示整個文件的物件。

Element

Element 物件

文件層次結構中的元素節點。

Attr

Attr 物件

元素節點上的屬性值節點。

Comment

Comment 物件

源文件中註釋的表示。

Text

Text 和 CDATASection 物件

包含文件文字內容的節點。

ProcessingInstruction

ProcessingInstruction 物件

處理指令表示。

還有一個額外的部分描述了在 Python 中使用 DOM 定義的異常。

DOMImplementation 物件

DOMImplementation 介面為應用程式提供了一種確定其正在使用的 DOM 中特定功能可用性的方法。DOM Level 2 添加了使用 DOMImplementation 建立新的 DocumentDocumentType 物件的功能。

DOMImplementation.hasFeature(feature, version)

如果由字串 featureversion 對標識的功能已實現,則返回 True

DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)

返回一個新的 Document 物件(DOM 的根),其中包含一個具有給定 namespaceUriqualifiedName 的子 Element 物件。 doctype 必須是由 createDocumentType() 建立的 DocumentType 物件,或者為 None。 在 Python DOM API 中,前兩個引數也可以為 None,以指示不建立 Element 子項。

DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)

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

Node 物件

XML 文件的所有元件都是 Node 的子類。

Node.nodeType

表示節點型別的整數。型別的符號常量位於 Node 物件上:ELEMENT_NODEATTRIBUTE_NODETEXT_NODECDATA_SECTION_NODEENTITY_NODEPROCESSING_INSTRUCTION_NODECOMMENT_NODEDOCUMENT_NODEDOCUMENT_TYPE_NODENOTATION_NODE。這是一個只讀屬性。

Node.parentNode

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

Node.attributes

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

Node.previousSibling

與此節點具有相同父節點的緊鄰前一個節點。例如,在 self 元素的開始標籤之前出現的具有結束標籤的元素。當然,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(other)

如果 other 指的是與此節點相同的節點,則返回 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(deep)

克隆此節點。 設定 deep 表示同時克隆所有子節點。 這將返回克隆的節點。

NodeList 物件

NodeList 表示一個節點序列。 這些物件在 DOM Core 建議中以兩種方式使用:Element 物件將其子節點列表作為其中之一提供,並且 getElementsByTagName()getElementsByTagNameNS() 方法返回具有此介面的物件來表示查詢結果。

DOM Level 2 建議為此類物件定義了一個方法和一個屬性

NodeList.item(i)

如果序列中存在第 i 個項,則返回該項,否則返回 None。 索引 i 不得小於零或大於或等於序列的長度。

NodeList.length

序列中節點的數量。

此外,Python DOM 介面要求提供一些額外的支援,以允許 NodeList 物件用作 Python 序列。 所有 NodeList 實現都必須包含對 __len__()__getitem__() 的支援; 這允許在 for 語句中迭代 NodeList,並正確支援 len() 內建函式。

如果 DOM 實現支援修改文件,則 NodeList 實現還必須支援 __setitem__()__delitem__() 方法。

DocumentType 物件

有關文件宣告的符號和實體(包括解析器使用並能提供資訊的外部子集)的資訊可從 DocumentType 物件中獲取。 文件的 DocumentType 可從 Document 物件的 doctype 屬性獲得; 如果文件沒有 DOCTYPE 宣告,則文件的 doctype 屬性將設定為 None 而不是此介面的例項。

DocumentTypeNode 的專門化,並新增以下屬性

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(data)

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

Document.createComment(data)

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

Document.createProcessingInstruction(target, data)

建立並返回一個包含作為引數傳遞的 targetdata 的處理指令節點。與其他建立方法一樣,此方法不會將節點插入到樹中。

Document.createAttribute(name)

建立並返回一個屬性節點。此方法不會將屬性節點與任何特定元素關聯。您必須在相應的 Element 物件上使用 setAttributeNode() 來使用新建立的屬性例項。

Document.createAttributeNS(namespaceURI, qualifiedName)

建立並返回帶有名稱空間的屬性節點。 tagName 可能帶有字首。此方法不會將屬性節點與任何特定元素關聯。您必須在相應的 Element 物件上使用 setAttributeNode() 來使用新建立的屬性例項。

Document.getElementsByTagName(tagName)

搜尋具有特定元素型別名稱的所有後代(直接子元素、子元素的子元素等)。

Document.getElementsByTagNameNS(namespaceURI, localName)

搜尋具有特定名稱空間 URI 和本地名稱的所有後代(直接子元素、子元素的子元素等)。本地名稱是字首後的名稱空間部分。

元素物件

ElementNode 的子類,因此繼承該類的所有屬性。

Element.tagName

元素型別名稱。在使用名稱空間的文件中,它可能包含冒號。該值是一個字串。

Element.getElementsByTagName(tagName)

Document 類中的等效方法相同。

Element.getElementsByTagNameNS(namespaceURI, localName)

Document 類中的等效方法相同。

Element.hasAttribute(name)

如果元素具有由 name 命名的屬性,則返回 True

Element.hasAttributeNS(namespaceURI, localName)

如果元素具有由 namespaceURIlocalName 命名的屬性,則返回 True

Element.getAttribute(name)

以字串形式返回由 name 命名的屬性的值。如果不存在此類屬性,則返回空字串,如同該屬性沒有值一樣。

Element.getAttributeNode(attrname)

返回由 attrname 命名的屬性的 Attr 節點。

Element.getAttributeNS(namespaceURI, localName)

以字串形式返回由 namespaceURIlocalName 命名的屬性的值。如果不存在此類屬性,則返回空字串,如同該屬性沒有值一樣。

Element.getAttributeNodeNS(namespaceURI, localName)

返回屬性值作為節點,給定 namespaceURIlocalName

Element.removeAttribute(name)

按名稱刪除屬性。如果沒有匹配的屬性,則會引發 NotFoundErr

Element.removeAttributeNode(oldAttr)

從屬性列表中移除並返回oldAttr,如果存在的話。如果oldAttr不存在,則會引發 NotFoundErr 異常。

Element.removeAttributeNS(namespaceURI, localName)

透過名稱移除一個屬性。請注意,它使用 localName,而不是 qname。如果沒有匹配的屬性,不會引發異常。

Element.setAttribute(name, value)

從字串設定一個屬性值。

Element.setAttributeNode(newAttr)

向元素新增一個新的屬性節點,如果 name 屬性匹配,則必要時替換現有屬性。如果發生替換,將返回舊的屬性節點。如果 newAttr 正在使用中,則會引發 InuseAttributeErr 異常。

Element.setAttributeNodeNS(newAttr)

向元素新增一個新的屬性節點,如果 namespaceURIlocalName 屬性匹配,則必要時替換現有屬性。如果發生替換,將返回舊的屬性節點。如果 newAttr 正在使用中,則會引發 InuseAttributeErr 異常。

Element.setAttributeNS(namespaceURI, qname, value)

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

Attr 物件

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

Attr.name

屬性名稱。在使用名稱空間的文件中,它可能包含冒號。

Attr.localName

如果存在冒號,則為冒號後面的名稱部分,否則為整個名稱。這是一個只讀屬性。

Attr.prefix

如果存在冒號,則為冒號前面的名稱部分,否則為空字串。

Attr.value

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

NamedNodeMap 物件

NamedNodeMap 繼承自 Node

NamedNodeMap.length

屬性列表的長度。

NamedNodeMap.item(index)

返回具有特定索引的屬性。獲取屬性的順序是任意的,但在 DOM 的生命週期內將保持一致。每個專案都是一個屬性節點。使用 value 屬性獲取其值。

還有一些實驗性方法可以使此類具有更多的對映行為。您可以使用它們,也可以使用 Element 物件上的標準化 getAttribute*() 方法系列。

Comment 物件

Comment 表示 XML 文件中的註釋。它是 Node 的子類,但不能有子節點。

Comment.data

註釋的內容,以字串形式表示。該屬性包含前導 <!-- 和尾隨 --> 之間的所有字元,但不包括它們。

Text 和 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 Level 2 推薦定義了一個異常,DOMException,以及許多常量,允許應用程式確定發生了哪種型別的錯誤。DOMException 例項攜帶一個 code 屬性,該屬性為特定異常提供適當的值。

Python DOM 介面提供了常量,但也擴充套件了異常集,以便為 DOM 定義的每個異常程式碼存在一個特定的異常。實現必須引發相應的特定異常,每個異常都攜帶 code 屬性的適當值。

異常 xml.dom.DOMException

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

異常 xml.dom.DomstringSizeErr

當指定的文字範圍不適合字串時引發。這在 Python DOM 實現中尚未使用,但可能從非 Python 編寫的 DOM 實現中接收到。

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

boolint

int

int

long int

int

unsigned int

int

DOMString

strbytes

null

None

訪問器方法

OMG IDL 到 Python 的對映為 IDL attribute 宣告定義了訪問器函式,其方式與 Java 對映非常相似。對映 IDL 宣告

readonly attribute string someValue;
         attribute string anotherValue;

會生成三個訪問器函式:someValue 的 “get” 方法 (_get_someValue()),以及 anotherValue 的 “get” 和 “set” 方法 (_get_anotherValue()_set_anotherValue())。特別是,該對映不要求 IDL 屬性可以作為普通的 Python 屬性訪問:不要求 object.someValue 可以工作,並且可能會引發 AttributeError

但是,Python DOM API 確實要求普通的屬性訪問有效。這意味著 Python IDL 編譯器生成的典型代理不太可能工作,並且如果透過 CORBA 訪問 DOM 物件,則客戶端可能需要包裝器物件。雖然這確實需要對 CORBA DOM 客戶端進行一些額外的考慮,但使用 Python 透過 CORBA 使用 DOM 的實現者並不認為這是一個問題。宣告為 readonly 的屬性可能不會限制所有 DOM 實現中的寫入訪問。

在 Python DOM API 中,不需要訪問器函式。如果提供,它們應該採用 Python IDL 對映定義的格式,但由於可以直接從 Python 訪問屬性,因此這些方法被認為是多餘的。永遠不應該為 readonly 屬性提供“設定”訪問器。

IDL 定義沒有完全體現 W3C DOM API 的要求,例如某些物件(例如 getElementsByTagName() 的返回值)是“即時的”概念。Python DOM API 不要求實現強制執行此類要求。