首页 > 代码库 > xml.dom——文档对象模型API

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

文档对象模型,或者“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

 

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