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返回。如果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

浙公网安备 33010602011771号
评论的对象
Comment代表一个评论在XML文档。它的一个子类Node,但不能有子节点。Comment.data评论的内容为字符串。领导之间的属性包含所有字符
<!--和落后-->,但不包括他们。