19.8. xml.dom —文档对象模型 API

2.0 版中的新Function。

文档对象模型或“ DOM”是来自 wwwunion(W3C)的一种跨语言 API,用于访问和修改 XML 文档。 DOM 实现将 XML 文档呈现为树结构,或者允许 Client 端代码从头开始构建这种结构。然后,它pass一组对象提供对结构的访问,这些对象提供了众所周知的接口。

DOM 对于随机访问应用程序非常有用。 SAX 一次只允许您查看一份文档。如果您正在查看一个 SAX 元素,则无权访问另一个元素。如果您正在查看文本节点,则无权访问包含元素。编写 SAX 应用程序时,需要在自己的代码中的某个位置跟踪程序在文档中的位置。 SAX 不会为您这样做。另外,如果您需要在 XML 文档中放眼 Future,那您就很不走运。

在无法访问树的事件驱动模型中,某些应用程序根本是不可能的。当然,您可以自己在 SAX 事件中构建某种树,但是 DOM 允许您避免编写该代码。 DOM 是 XML 数据的标准树表示形式。

W3C 正在分阶段定义文档对象模型,或称其术语为“级别”。 API 的 PythonMap 基本上基于 DOM Level 2 建议。

DOM 应用程序通常从将某些 XML 解析为 DOM 开始。 DOM 级别 1 根本没有涵盖如何完成此工作,而 Level 2 仅提供了有限的改进:有一个DOMImplementation对象类,该类提供对Document创建方法的访问,但是无法访问 XML 读取器/解析器/文档构建器与实现无关的方式。没有现有的Document对象,也没有明确定义的方法来访问这些方法。在 Python 中,每个 DOM 实现都将提供一个函数getDOMImplementation()。 DOM 级别 3 添加了“加载/存储”规范,该规范定义了与阅读器的接口,但是 Python 标准库中尚未提供该接口。

一旦有了 DOM 文档对象,就可以pass其属性和方法访问 XML 文档的各个部分。这些属性在 DOM 规范中定义。参考手册的这一部分描述了 Python 中规范的解释。

W3C 提供的规范定义了 Java,ECMAScript 和 OMG IDL 的 DOM API。此处定义的 PythonMap 在很大程度上基于规范的 IDL 版本,但不需要严格遵守(尽管实现可以自由支持 IDL 的严格 Map)。有关 Map 要求的详细讨论,请参见Conformance部分。

See also

19.8.1. 模块内容

xml.dom包含以下Function:

如果未提供名称,它将检查可用的实现,以找到具有所需Function集的实现。如果找不到实现,请引发ImportError。Function列表必须是(feature, version)对的序列,这些对将被传递到可用DOMImplementation对象上的hasFeature()方法。

还提供了一些方便性常量:

2.2 版中的新Function。

2.2 版中的新Function。

2.2 版中的新Function。

2.2 版中的新Function。

另外,xml.dom包含基Node类和 DOM 异常类。此模块提供的Node类未实现 DOM 规范定义的任何方法或属性;具体的 DOM 实现必须提供这些实现。作为此模块的一部分提供的Node类的确提供了用于Node具体对象的nodeType属性的常量。它们位于类中而不是模块级别,以符合 DOM 规范。

19.8.2. DOM 中的对象

DOM 的 Authority 文档是 W3C 的 DOM 规范。

请注意,DOM 属性也可以作为节点而不是简单的字符串进行操作。但是,您很少必须执行此操作,因此尚未对此用法进行记录。

Interface Section Purpose
DOMImplementation DOMImplementation Objects 与基础实现的接口。
Node Node Objects 文档中大多数对象的基本接口。
NodeList NodeList Objects 一系列节点的接口。
DocumentType DocumentType Objects 有关处理文档所需的语句的信息。
Document Document Objects 代表整个文档的对象。
Element Element Objects 文档层次结构中的元素节点。
Attr Attr Objects 元素节点上的属性值节点。
Comment Comment Objects 源文档中 Comments 的表示形式。
Text 文本和 CDATASection 对象 包含文档中文本内容的节点。
ProcessingInstruction ProcessingInstruction Objects 处理指令表示。

另一部分描述了为在 Python 中使用 DOM 定义的异常。

19.8.2.1. DOMI 实现对象

DOMImplementation界面为应用程序提供了一种方法来确定其使用的 DOM 中特定Function的可用性。 DOM 2 级增加了使用DOMImplementation创建新的DocumentDocumentType对象的Function。

19.8.2.2. 节点对象

XML 文档的所有组件都是Node的子类。

Note

这基于提议的 DOM Level 3 API,该 API 仍处于“工作草案”阶段,但是该特定接口似乎没有争议。从 W3C 进行的更改不一定会影响 Python DOM 接口中的此方法(尽管也将为此提供任何新的 W3C API)。

2.1 版中的新Function。

19.8.2.3. NodeList 对象

NodeList代表节点序列。在 DOM Core 建议中,以两种方式使用这些对象:Element对象提供一个作为其子节点列表,而NodegetElementsByTagName()getElementsByTagNameNS()方法pass此接口返回对象来表示查询结果。

DOM 2 级建议为这些对象定义了一种方法和一种属性:

另外,Python DOM 接口要求提供一些额外的支持,以允许将NodeList对象用作 Python 序列。所有NodeList实现都必须包括对len()getitem()的支持;这样可以在for语句中的NodeList上进行迭代,并适当支持len()内置函数。

如果 DOM 实现支持文档的修改,则NodeList实现也必须支持setitem()delitem()方法。

19.8.2.4. DocumentType 对象

可以从DocumentType对象获得有关文档语句的符号和实体的信息(如果解析器使用它,并且可以提供信息,则包括外部子集)。文档的DocumentType可从Document对象的doctype属性获得;如果文档没有DOCTYPE语句,则文档的doctype属性将设置为None而不是此接口的实例。

DocumentTypeNode的特殊化,并添加了以下属性:

19.8.2.5. 文件物件

Document代表整个 XML 文档,包括其组成元素,属性,处理指令,Comments 等。请记住,它继承了Node的属性。

19.8.2.6. 元素对象

ElementNode的子类,因此继承了该类的所有属性。

19.8.2.7. 属性对象

Attr继承自Node,因此继承了其所有属性。

19.8.2.8. NamedNodeMap 对象

NamedNodeMap 不是Node继承。

也有实验方法使此类具有更多 Map 行为。您可以使用它们,也可以对Element对象使用标准化的getAttribute*()方法族。

19.8.2.9. Comments 对象

Comment表示 XML 文档中的 Comments。它是Node的子类,但不能有子节点。

19.8.2.10. 文本和 CDATASection 对象

Text接口表示 XML 文档中的文本。如果解析器和 DOM 实现支持 DOM 的 XML 扩展,则 CDATA 标记的部分中包含的部分文本存储在CDATASection对象中。这两个接口是相同的,但是为nodeType属性提供了不同的值。

这些接口扩展了Node接口。他们不能有子节点。

Note

CDATASection节点的使用并不表示该节点代表完整的 CDATA 标记部分,而仅表示该节点的内容是 CDATA 部分的一部分。单个 CDATA 节可由文档树中的多个节点表示。无法确定两个相邻的CDATASection节点是否代表不同的 CDATA 标记部分。

19.8.2.11. 处理指令对象

表示 XML 文档中的处理指令;它继承自Node接口,不能有子节点。

19.8.2.12. Exceptions

2.1 版中的新Function。

DOM Level 2 建议定义了一个异常DOMException,以及多个常量,这些常量使应用程序可以确定发生了哪种错误。 DOMException个实例带有code属性,该属性为特定的异常提供适当的值。

Python DOM 接口提供了常量,但也扩展了异常集,因此 DOM 定义的每个异常代码都存在特定的异常。实现必须引发适当的特定异常,每个异常都带有code属性的适当值。

DOM 推荐中定义的异常代码根据此表 Map 到上述异常:

Constant Exception
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

19.8.3. Conformance

本节描述了 Python DOM API,W3C DOM 建议和用于 Python 的 OMG IDLMap 之间的一致性要求和关系。

19.8.3.1. 类型 Map

根据下表,将 DOM 规范中使用的原始 IDL 类型 Map 为 Python 类型。

IDL Type Python Type
boolean IntegerType(值为01)
int IntegerType
long int IntegerType
unsigned int IntegerType

此外,建议中定义的DOMStringMap 到 Python 字符串或 Unicode 字符串。每当从 DOM 返回字符串时,应用程序都应该能够处理 Unicode。

IDL null值 Map 到None,只要 API 允许null,该实现就可以接受或提供。

19.8.3.2. 存取器方法

从 OMG IDL 到 Python 的 Map 非常像 JavaMap 那样定义 IDL attribute语句的访问器函数。MapIDL 语句

readonly attribute string someValue;
         attribute string anotherValue;

产生三个访问器函数:someValue(_get_someValue())的“ get”方法,anotherValue(_get_anotherValue()_set_anotherValue())的“ get”和“ set”方法。尤其是,该 Map 不要求 IDL 属性可以像普通 Python 属性一样进行访问:object.someValue不需要起作用的,并且可以引发AttributeError

但是,Python DOM API 确实需要正常的属性访问工作。这意味着由 Python IDL 编译器生成的典型代理不太可能起作用,并且如果pass CORBA 访问 DOM 对象,则可能在 Client 端上需要包装对象。尽管这确实需要对 CORBA DOMClient 端进行一些其他考虑,但是具有使用 Python 上的 CORBA 上的 DOM 经验的实现者并不认为这是一个问题。语句为readonly的属性可能不会限制所有 DOM 实现中的写访问。

在 Python DOM API 中,不需要访问器函数。如果提供的话,它们应该采用 Python IDLMap 定义的形式,但是这些属性被认为是不必要的,因为可以直接从 Python 访问这些属性。切勿为readonly属性提供“设置”访问器。

IDL 定义没有完全体现 W3C DOM API 的要求,例如某些对象的概念,例如getElementsByTagName()的返回值“处于活动状态”。 Python DOM API 不需要实现即可强制执行此类要求。

首页