原始碼:
Lib/xml/dom/__init__.py
文档对象模型“DOM”是一个来自万维网联盟(W3C)的跨语言 API,用于访问和修改 XML 文档。 DOM 的实现将 XML 文档以树结构表示,或者允许客户端代码从头构建这样的结构。 然后它会通过一组提供通用接口的对象赋予对结构的访问权。
DOM 特别适用于进行随机访问的应用。 SAX 仅允许你每次查看文档的一小部分。 如果你正在查看一个 SAX 元素,你将不能访问其他元素。 如果你正在查看一个文本节点,你将不能访问包含它的元素。 当你编写一个 SAX 应用时,你需要在你自己的代码的某个地方记住你的程序在文档中的位置。 SAX 不会帮你做这件事。 并且,如果你想要在 XML 文档中向前查看,你是绝对办不到的。
有些应用程序在不能访问树的事件驱动模型中是根本无法编写的。 当然你可以在 SAX 事件中自行构建某种树,但是 DOM 可以使你避免编写这样的代码。 DOM 是针对 XML 数据的标准树表示形式。
文档对象模型是由 W3C 分阶段定义的,在其术语中称为“层级”。 Python 中该 API 的映射大致是基于 DOM 第 2 层级的建议。
DOM 应用程序通常从将某些 XML 解析为 DOM 开始。 此操作如何实现完全未被 DOM 第 1 层级所涉及,而第 2 层级也只提供了有限的改进:有一个
DOMImplementation
对象类,它提供对
Document
创建方法的访问,但却没有办法以不依赖具体实现的方式访问 XML 读取器/解析器/文档创建器。 也没有当不存在
Document
对象的情况下访问这些方法的定义良好的方式。 在 Python 中,每个 DOM 实现将提供一个函数
getDOMImplementation()
。 DOM 第 3 层级增加了一个载入/存储规格说明,它定义了与读取器的接口,但这在 Python 标准库中尚不可用。
一旦你得到了 DOM 文档对象,你就可以通过 XML 文档的属性和方法访问它的各个部分。 这些属性定义在 DOM 规格说明当中;参考指南的这一部分描述了 Python 对此规格说明的解读。
W3C 提供的规格说明定义了适用于 Java, ECMAScript 和 OMG IDL 的 DOM API。 这里定义的 Python 映射很大程度上是基于此规格说明的 IDL 版本,但并不要求严格映射(但具体实现可以自由地支持对 IDL 的严格映射)。 请参阅
一致性
一节查看有关映射要求的详细讨论。
文档对象模型 (DOM) 第 2 层级规格说明
被 Python DOM API 作为基础的 W3C 建议。
文档对象模型 (DOM) 第 1 层级规格说明
被
xml.dom.minidom
所支持的 W3C 针对 DOM 的建议。
Python 语言映射规格说明
此文档指明了从 OMG IDL 到 Python 的映射。
xml.dom.
getDOMImplementation
(
name
=
None
,
features
=
()
)
返回一个适当的 DOM 实现。
name
是通用名称、DOM 实现的模块名称或者
None
。 如果它不为
None
,则会导入相应模块并在导入成功时返回一个
DOMImplementation
对象。 如果没有给出名称,并且如果设置了
PYTHON_DOM
环境变量,此变量会被用来查找相应的实现。
如果未给出 name,此函数会检查可用的实现来查找具有所需特性集的一个。 如果找不到任何实现,则会引发
ImportError
。 features 集必须是包含
(feature,
version)
对的序列,它会被传给可用的
DOMImplementation
对象上的
hasFeature()
方法。
还提供了一些便捷常量:
xml.dom.
EMPTY_NAMESPACE
该值用于指明没有命名空间被关联到 DOM 中的某个节点。 它通常被作为某个节点的
namespaceURI
,或者被用作某个命名空间专属方法的
namespaceURI
参数。
此外,
xml.dom
还包含一个基本
Node
类和一些 DOM 异常类。 此模块提供的
Node
类未实现 DOM 规格描述所定义的任何方法和属性;实际的 DOM 实现必须提供它们。 提供
Node
类作为此模块的一部分并没有提供用于实际的
Node
对象的
nodeType
属性的常量;它们是位于类内而不是位于模块层级以符合 DOM 规格描述。
DOM 中的对象
DOM 的权威文档是来自 W3C 的 DOM 规格描述。
请注意,DOM 属性也可以作为节点而不是简单的字符串进行操作。 然而,必须这样做的情况相当少见,所以这种用法还没有被写入文档。
DOMImplementation 物件
DOMImplementation
接口提供了一种让应用程序确定他们所使用的 DOM 中某一特性可用性的方式。 DOM 第 2 级还添加了使用
DOMImplementation
来创建新的
Document
和
DocumentType
对象的能力。
DOMImplementation.
hasFeature
(
feature
,
version
)
如果字符串对
feature
和
version
所标识的特性已被实现则返回
True
。
Node.
isSameNode
(
other
)
如果
other
指向的节点就是此节点则返回
True
。 这对于使用了任何代理架构的 DOM 实现来说特别有用(因为多个对象可能指向相同节点)。
这是基于已提议的 DOM 第 3 等级 API,目前尚处于“起草”阶段,但这个特定接口看来并不存在争议。 来自 W3C 的修改将不会影响 Python DOM 接口中的这个方法(不过针对它的任何新 W3C API 也将受到支持)。
NodeList 物件
NodeList
代表一个节点列表。 在 DOM 核心建议中这些对象有两种使用方式: 由
Element
对象提供作为其子节点列表,以及由
Node
的
getElementsByTagName()
和
getElementsByTagNameNS()
方法通过此接口返回对象来表示查询结果。
DOM 第 2 层级建议为这些对象定义一个方法和一个属性:
NodeList.
item
(
i
)
从序列中返回第
i
项,如果序列不为空的话,否则返回
None
。 索引号
i
不允许小于零或大于等于序列的长度。
此外,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
。
NamedNodeMap.
item
(
index
)
返回特定带有索引号的属性。 获取属性的顺序是强制规定的,但在 DOM 的生命期内会保持一致。 其中每一项均为属性节点。 可使用
value
属性获取其值。
还有一些试验性方法给予这个类更多的映射行为。 你可以使用这些方法或者使用
Element
对象上标准化的
getAttribute*()
方法族。
注释的内容是一个字符串。 该属性包含在开头
<!-
-
和末尾
-
->
之间的所有字符,但不包括这两个符号。
Text 和 CDATASection 对象
Text
接口代表 XML 文档中的文本。 如果解析器和 DOM 实现支持 DOM 的 XML 扩展,则包裹在 CDATA 标记的节中的部分会被存储到
CDATASection
对象中。 这两个接口很相似,但是提供了不同的
nodeType
属性值。
这些接口扩展了
Node
接口。 它们不能拥有下级节点。
Text.
data
字符串形式的文本节点内容。
CDATASection
节点的使用并不表示该节点代表一个完整的 CDATA 标记节,只是表示该节点的内容是 CDATA 节的一部分。 单个 CDATA 节可以由文档树中的多个节点来表示。 没有什么办法能确定两个相邻的
CDATASection
节点是否代表不同的 CDATA 标记节。
ProcessingInstruction 物件
代表 XML 文档中的处理指令。 它继承自
Node
接口并且不能拥有下级节点。
ProcessingInstruction.
target
到第一个空格符为止的处理指令内容。 这是个只读属性。
DOM 第 2 层级推荐定义一个异常
DOMException
,以及多个变量用来允许应用程序确定发生了何种错误。
DOMException
实例带有
code
属性用来提供特定异常所对应的值。
Python DOM 接口提供了一些常量,但还扩展了异常集以使 DOM 所定义的每个异常代码都存在特定的异常。 接口的具体实现必须引发正确的特定异常,它们各自带有正确的
code
属性值。
exception
xml.dom.
DOMException
所有特定 DOM 异常所使用的异常基类。 该异常类不可被直接实例化。
访问器方法
从 OMG IDL 到 Python 的映射以类似于 Java 映射的方式定义了针对 IDL
attribute
声明的访问器函数。 映射以下 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 解译器生成的典型代理有可能会不可用,如果 DOM 对象是通过 CORBA 来访问则在客户端可能需要有包装对象。 虽然这确实要求为 CORBA DOM 客户端进行额外的考虑,但具有从 Python 通过 CORBA 使用 DOM 经验的实现并不会认为这是个问题。 已经声明了 readonly
的属性不必在所有 DOM 实现中限制写入访问。
在 Python DOM API 中,访问器函数不是必须的。 如果提供,则它们应当采用由 Python IDL 映射所定义的形式,但这些方法会被认为不必要,因为这些属性可以从 Python 直接访问。 永远都不要为 readonly
属性提供 "set" 访问器。
IDL 定义没有完全体现 W3C DOM API 的要求,如特定对象的概念,又如 getElementsByTagName()
的返回值为 "live" 等。 Python DOM API 并不强制具体实现执行这些要求。
2001-2024, Python Software Foundation.
This page is licensed under the Python Software Foundation License Version 2.
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
See History and License for more information.