您当前的位置: 首页 >  Python

插件开发

暂无认证

  • 0浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Python-XML-文档对象模型-创建元素-删除元素-设置属性-删除属性-核心要义

插件开发 发布时间:2022-05-06 08:59:08 ,浏览量:0

文章目录
    • 1.概述
    • 2.模块内容
    • 3.DOM对象
      • 3.1.DOMImplementation 对象
      • 3.2.Node对象
        • 3.2.1.Node.nodeType
        • 3.2.2.Node.parentNode
        • 3.2.3.Node.attributes
        • 3.2.4.Node.previousSibling
        • 3.2.5.Node.nextSibling
        • 3.2.6.Node.childNodes
        • 3.2.7.Node.firstChild
        • 3.2.8.Node.lastChild
        • 3.2.9.Node.localName
        • 3.2.10.Node.prefix
        • 3.2.11.Node.namespaceURI
        • 3.2.12.Node.nodeName
        • 3.2.13.Node.nodeValue
        • 3.2.14.Node.hasAttributes( )
        • 3.2.15.Node.hasChildNodes( )
        • 3.2.16.Node.isSameNode(其他)
        • 3.2.17.Node.appendChild( newChild )
        • 3.2.18.Node.insertBefore( newChild , refChild )
        • 3.2.19.Node.removeChild(oldChild)
        • 3.2.20.Node.replaceChild( newChild , oldChild )
        • 3.2.21.Node.normalize( )
        • 3.2.22.Node.cloneNode(deep)
      • 3.3.Document对象
        • 3.3.1.Document.documentElement
        • 3.3.2.Document.createElement(tagName)
        • 3.3.3.Document.createElementNS(namespaceURI, tagName)
        • 3.3.4.Document.createTextNode(data)
        • 3.3.5.Document.createComment(data)
        • 3.3.6.Document.createProcessingInstruction(target, data)
        • 3.3.7.Document.createAttribute(name)
        • 3.3.8.Document.createAttributeNS( namespaceURI , qualifiedName )
        • 3.3.9.Document.getElementsByTagName(tagName)
        • 3.3.10.Document.getElementsByTagNameNS( namespaceURI , localName )
        • 3.3.9.范例代码
      • 3.4.Element对象
        • 3.4.1.Element.tagName
        • 3.4.2.Element.getElementsByTagName(tagName)
        • 3.4.3.Element.getElementsByTagNameNS( namespaceURI , localName )
        • 3.4.4.Element.hasAttribute(name)
        • 3.4.5.Element.hasAttributeNS( namespaceURI , localName )
        • 3.4.6.Element.getAttribute(name)
        • 3.4.7.Element.getAttributeNode( attrname )
        • 3.4.8.Element.getAttributeNS( namespaceURI , localName )
        • 3.4.9.Element.getAttributeNodeNS( namespaceURI , localName )
        • 3.4.10.Element.removeAttribute(name)
        • 3.4.11.Element.removeAttributeNode(oldAttr )
        • 3.4.12.Element.removeAttributeNS(namespaceURI , localName )
        • 3.4.13.Element.setAttribute( name, value)
        • 3.4.14.Element.setAttributeNode( newAttr )
        • 3.4.15.Element.setAttributeNodeNS( newAttr )
        • 3.4.16.Element.setAttributeNS( namespaceURI , qname , value )
        • 3.4.17.范例代码
      • 3.5.Attr 对象
        • 3.5.1.Attr.name
        • 3.5.2.Attr.localName
        • 3.5.3.Attr.prefix
        • 3.5.4.Attr.value
    • 4.作者答疑
    • 5.参考资料

1.概述

  文档对象模型或“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 级别 1 根本没有涵盖如何实现这一点,级别 2 仅提供了有限的改进:有一个DOMImplementation对象类提供对Document创建方法的访问,但无法在实现中访问 XML 阅读器/解析器/文档构建器- 独立的方式。在没有现有 Document对象的情况下,也没有明确定义的方式来访问这些方法。在 Python 中,每个 DOM 实现都会提供一个 function getDOMImplementation()。DOM Level 3 添加了一个 Load/Store 规范,它定义了一个读取器的接口,但这在 Python 标准库中尚不可用。

2.模块内容

2.1 xml.dom.registerDOMImplementation(name, factory)   使用名称name注册工厂函数。工厂函数应该返回一个实现 接口的对象。 2.2 xml.dom.getDOMImplementation(name=None, features=())   返回一个合适的 DOM 实现。该名称要么是众所周知的,DOM 实现的模块名称,要么是None. 如果不是None,则导入相应的模块,DOMImplementation如果导入成功则返回一个对象。如果没有给出名称,并且如果环境变量 PYTHON_DOM已设置,此变量用于查找实现。如果未给出名称,则会检查可用的实现以找到具有所需功能集的实现。如果找不到实现,抛出ImportError。

3.DOM对象

  DOM 的权威文档是来自 W3C 的 DOM 规范。基本内容如下:

界面部分目的DOMImplementationDOMImplementation 对象底层实现的接口。Node节点对象文档中大多数对象的基本接口。NodeList节点列表对象一系列节点的接口。DocumentType文档类型对象有关处理文件所需声明的信息。Document文档对象代表整个文档的对象。Element元素对象文档层次结构中的元素节点。Attr属性对象元素节点上的属性值节点。Comment评论对象源文档中注释的表示。Text文本和 CDATASection 对象包含来自文档的文本内容的节点。ProcessingInstruction处理指令对象处理指令表示。 3.1.DOMImplementation 对象

该DOMImplementation接口为应用程序提供了一种方法来确定它们正在使用的 DOM 中特定功能的可用性。 3.1.1 DOMImplementation.hasFeature(feature, version)   特征是否存在。 3.1.2 DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)   返回一个新Document对象(DOM 的根),其子 Element对象具有给定的namespaceUri和qualifiedName。doctype必须是 DocumentType对象 。 3.1.3 DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)   返回一个新DocumentType对象,该对象封装了给定的 qualifiedName、publicId和systemId字符串,表示XML 文档类型声明中包含的信息。   范例代码如下:


# 引入xml.dom模块
import xml.dom
 
# 获得DOMImplementation对象
domImp = xml.dom.getDOMImplementation()
# 通过DOMImplementation对象创建Document对象
doc = domImp.createDocument(None, None, None)
3.2.Node对象

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

3.2.1.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. 这是一个只读属性。

3.2.2.Node.parentNode

当前节点的父节点,文档节点的父节点未None。该值始终是一个Node对象或None。对于Element节点,这将是父元素,根元素除外,在这种情况下它将是Document对象。对于Attr节点,这始终是 None。这是一个只读属性。

3.2.3.Node.attributes

一个字典类型的属性对象。

3.2.4.Node.previousSibling

紧接在此节点之前的具有相同父节点的节点。例如,带有结束标签的元素恰好位于self 元素的开始标签之前。当然,XML 文档不仅仅是由元素组成的,因此前一个兄弟元素可以是文本、注释或其他内容。如果此节点是父节点的第一个子节点,则此属性将为 None,这是一个只读属性。

3.2.5.Node.nextSibling

紧随其后的具有相同父节点的节点。另请参阅 previousSibling。如果这是父级的最后一个子级,则此属性将为None,这是一个只读属性。

3.2.6.Node.childNodes

此节点中包含的节点列表。这是一个只读属性。

3.2.7.Node.firstChild

节点的第一个子节点,如果有的话,或者None。这是一个只读属性。

3.2.8.Node.lastChild

节点的最后一个子节点,如果有的话,或者None。这是一个只读属性。

3.2.9.Node.localName

如果有冒号,就是它后面的部分tagName,否则为整个tagName。该值是一个字符串。

3.2.10.Node.prefix

如果有冒号,冒号前面的部分tagName,否则为空字符串。该值是一个字符串,或None。

3.2.11.Node.namespaceURI

与元素名称关联的命名空间。这将是一个字符串或 None,这是一个只读属性。

3.2.12.Node.nodeName

这对每种节点类型都有不同的含义;有关详细信息,请参阅 DOM 规范。您始终可以从另一个属性(例如tagName元素的属性或name 属性的属性)获取您在此处获得的信息。对于所有节点类型,此属性的值将是字符串或None,这是一个只读属性。

3.2.13.Node.nodeValue

这对每种节点类型都有不同的含义;有关详细信息,请参阅 DOM 规范。情况与nodeName. 该值是一个字符串或None.

3.2.14.Node.hasAttributes( )

如果节点有任何属性,则返回True。

3.2.15.Node.hasChildNodes( )

如果节点有任何子节点,则返回True。

3.2.16.Node.isSameNode(其他)

如果other引用与此节点相同的节点,则返回True。这对于使用任何类型的代理架构的 DOM 实现特别有用(因为多个对象可以引用同一个节点)。

3.2.17.Node.appendChild( newChild )

在子节点列表的末尾向该节点添加一个新子节点,返回newChild。如果节点已经在树中,则首先将其删除。

3.2.18.Node.insertBefore( newChild , refChild )

在现有子节点之前插入一个新子节点。必须是 refChild是该节点的子节点;如果没有,抛出ValueError。 返回newChild。如果refChild是None,它将newChild插入到子列表的末尾。

3.2.19.Node.removeChild(oldChild)

删除一个子节点。 oldChild必须是该节点的子节点;如果没有, 抛出ValueError。 成功返回oldChild。如果oldChild 不会被进一步使用,应该调用它的unlink()方法。

3.2.20.Node.replaceChild( newChild , oldChild )

用新节点替换现有节点。oldChild 是这个节点的子节点;如果没有, 抛出ValueError。

3.2.21.Node.normalize( )

连接相邻的文本节点,以便将所有文本段存储为单个 Text实例。这简化了许多应用程序处理来自 DOM 树的文本。

3.2.22.Node.cloneNode(deep)

克隆此节点。设置deep也意味着克隆所有子节点。并返回克隆。

3.3.Document对象

Document表示整个 XML 文档,包括其组成元素、属性、处理指令、注释等。请记住,它继承自Node。

3.3.1.Document.documentElement

文档的唯一且唯一的根元素。

3.3.2.Document.createElement(tagName)

创建并返回一个新的元素节点。该元素在创建时不会插入到文档中。您需要使用其他方法之一显式插入它,例如insertBefore()or appendChild()。

3.3.3.Document.createElementNS(namespaceURI, tagName)

创建并返回具有命名空间的新元素。tagName可能有一个前缀。该元素在创建时不会插入到文档中。您需要使用其他方法之一显式插入它,例如 insertBefore()or appendChild()。

3.3.4.Document.createTextNode(data)

创建并返回包含作为参数传递的数据的文本节点。与其他创建方法一样,此方法不会将节点插入树中。

3.3.5.Document.createComment(data)

创建并返回一个注释节点,其中包含作为参数传递的数据。与其他创建方法一样,此方法不会将节点插入树中。

3.3.6.Document.createProcessingInstruction(target, data)

创建并返回包含目标和 作为参数传递的数据的处理指令节点。与其他创建方法一样,此方法不会将节点插入树中。

3.3.7.Document.createAttribute(name)

创建并返回一个属性节点。此方法不将属性节点与任何特定元素相关联。您必须 setAttributeNode()在适当的Element对象上使用才能使用新创建的属性实例。

3.3.8.Document.createAttributeNS( namespaceURI , qualifiedName )

创建并返回具有命名空间的属性节点。tagName可能有一个前缀。此方法不将属性节点与任何特定元素相关联。您必须setAttributeNode()在适当的 Element对象上使用才能使用新创建的属性实例。

3.3.9.Document.getElementsByTagName(tagName)

搜索具有特定元素类型名称的所有后代(直接子代、子代的子代等)。

3.3.10.Document.getElementsByTagNameNS( namespaceURI , localName )

搜索具有特定命名空间 URI 和本地名称的所有后代(直接子代、子代的子代等)。localname 是前缀之后的命名空间的一部分。

3.3.9.范例代码
# 首先引入xml.dom.minidom库的xml解析器
from xml.dom.minidom import parse
 
# 使用解析器解析example.xml文件,dom是返回的document对象
dom = parse('example.xml')
# 获取xml中所有叫book的Element
# 注意books是NodeList对象,可以通过NodeList对象的item(i)方法获取具体的Node,
# 也可以通过NodeList对象的length属性得到Node数量
books = dom.getElementsByTagName('book')
print(len(books))
3.4.Element对象

Element是Node的子类,因此继承了该类的所有属性。

3.4.1.Element.tagName

元素类型名称。在使用命名空间的文档中,它可能包含冒号。该值是一个字符串。

3.4.2.Element.getElementsByTagName(tagName)

与类中的等效方法相同Document。

3.4.3.Element.getElementsByTagNameNS( namespaceURI , localName )

与类中的等效方法相同Document。

3.4.4.Element.hasAttribute(name)

True如果元素具有以name命名的属性,则返回。

3.4.5.Element.hasAttributeNS( namespaceURI , localName )

True如果元素具有由namespaceURI和 localName命名的属性,则返回。

3.4.6.Element.getAttribute(name)

将name命名的属性的值作为字符串返回。如果不存在这样的属性,则返回一个空字符串,就好像该属性没有值一样。

3.4.7.Element.getAttributeNode( attrname )

返回由attrname命名的属性的节点。

3.4.8.Element.getAttributeNS( namespaceURI , localName )

以字符串形式返回由namespaceURI和localName命名的属性的值。如果不存在这样的属性,则返回一个空字符串,就好像该属性没有值一样。

3.4.9.Element.getAttributeNodeNS( namespaceURI , localName )

给定namespaceURI和localName,将属性值作为节点返回。

3.4.10.Element.removeAttribute(name)

按名称删除属性。如果没有匹配的属性, NotFoundErr则引发 a。

3.4.11.Element.removeAttributeNode(oldAttr )

从属性列表中删除并返回oldAttr (如果存在)。如果oldAttr不存在,NotFoundErr则引发。

3.4.12.Element.removeAttributeNS(namespaceURI , localName )

按名称删除属性。请注意,它使用 localName,而不是 qname。如果没有匹配的属性,则不会引发异常。

3.4.13.Element.setAttribute( name, value)

从字符串设置属性值。

3.4.14.Element.setAttributeNode( newAttr )

name将新属性节点添加到元素,如果属性匹配,则在必要时替换现有属性。如果发生替换,将返回旧的属性节点。如果newAttr已经在使用, InuseAttributeErr将被抛出。

3.4.15.Element.setAttributeNodeNS( newAttr )

namespaceURI将新属性节点添加到元素,如果和localName属性匹配,则在必要时替换现有属性。如果发生替换,将返回旧的属性节点。如果newAttr 已经在使用,InuseAttributeErr将被抛出。

3.4.16.Element.setAttributeNS( namespaceURI , qname , value )

在给定namespaceURI和qname的情况下,从字符串中设置属性值。请注意,qname 是整个属性名称。这与上面的不同。

3.4.17.范例代码
# 引入xml.dom模块
import xml.dom
 
# 获得DOMImplementation对象
domImp = xml.dom.getDOMImplementation()
 
# 通过DOMImplementation对象创建Document对象
doc = domImp.createDocument(None, None, None)
 
# 为Document对象添加root节点
rootNode = doc.createElement("person_table")
doc.appendChild(rootNode)
 
# 为root节点创建一个person子节点:小明
xiaomingNode = doc.createElement("person")
rootNode.appendChild(xiaomingNode)
 
## 为xiaomingNode添加name属性
nameNode = doc.createAttribute("name")
xiaomingNode.setAttributeNode(nameNode)
xiaomingNode.setAttribute("name","小明")
 
## 为xiaomingNode添加电话节点
telNode = doc.createElement("tel")
telValue = doc.createTextNode("15942637104")
telNode.appendChild(telValue)
xiaomingNode.appendChild(telNode)
 
# 为rootNode添加另一个person子节点
xiaohongNode = doc.createElement("person")
rootNode.appendChild(xiaohongNode)
 
## 添加name属性
nameNode = doc.createAttribute("name")
xiaohongNode.setAttributeNode(nameNode)
xiaohongNode.setAttribute("name","小红")
 
## 为xiaohongNode添加电话节点
telNode = doc.createElement("tel")
telValue = doc.createTextNode("15330838240")
telNode.appendChild(telValue)
xiaohongNode.appendChild(telNode)
 
print(doc.toxml())
 
with open("new.xml", 'w', encoding='utf-8') as writer:
    doc.writexml(writer, indent='\n', addindent='    ')
3.5.Attr 对象

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

3.5.1.Attr.name

属性名称。在使用命名空间的文档中,它可能包含一个冒号。

3.5.2.Attr.localName

冒号后面的名称部分(如果有),否则为整个名称。这是一个只读属性。

3.5.3.Attr.prefix

冒号前面的名称部分(如果有),否则为空字符串。

3.5.4.Attr.value

属性的文本值。这是 nodeValue属性的同义词。

4.作者答疑

  如有疑问,敬请留言。

5.参考资料

https://docs.python.org/3/library/xml.dom.html#domimplementation-objects

关注
打赏
1665481431
查看更多评论
立即登录/注册

微信扫码登录

0.0392s