​xml.dom.minidom --- 最小化的 DOM 实现​

源代码: Lib/xml/dom/minidom.py


xml.dom.minidom 是文档对象模型接口的最小化实现,具有与其他语言类似的 API。 它的目标是比完整 DOM 更简单并且更为小巧。 对于 DOM 还不十分熟悉的用户则应当考虑改用 xml.etree.ElementTree 模块来进行 XML 处理。

警告

xml.dom.minidom 模块对于恶意构建的数据是不安全的。 如果你需要解析不受信任或未经身份验证的数据,请参阅 XML 漏洞。

DOM 应用程序通常会从将某个 XML 解析为 DOM 开始。 使用 xml.dom.minidom 时,这是通过各种解析函数来完成的:

from xml.dom.minidom import parse, parseStringdom1 = parse('c:\\temp\\mydata.xml')  # parse an XML file by namedatasource = open('c:\\temp\\mydata.xml')
dom2 = parse(datasource)  # parse an open filedom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')

parse() 函数可接受一个文件名或者打开的文件对象。

xml.dom.minidom.parse(filename_or_fileparser=Nonebufsize=None)

根据给定的输入返回一个 Document。 filename_or_file 可以是一个文件名,或是一个文件类对象。 如果给定 parser 则它必须是一个 SAX2 解析器对象。 此函数将修改解析器的处理程序并激活命名空间支持;其他解析器配置(例如设置一个实体求解器)必须已经提前完成。

如果你将 XML 存放为字符串形式,则可以改用 parseString() 函数:

xml.dom.minidom.parseString(stringparser=None)

返回一个代表 string 的 Document。 此方法会为指定字符串创建一个 io.StringIO 对象并将其传递给 parse()。

两个函数均返回一个代表文档内容的 Document 对象。object representing the content of the document.

parse() 和 parseString() 函数所做的是将 XML 解析器连接到一个 "DOM 构建器",它可以从任意 SAX 解析器接收解析事件并将其转换为 DOM 树结构。 这两个函数的名称可能有些误导性,但在学习此接口时是很容易掌握的。 文档解析操作将在这两个函数返回之前完成;简单地说这两个函数本身并不提供解析器实现。

你也可以通过在一个 "DOM 实现" 对象上调用方法来创建 Document。 此对象可通过调用 xml.dom 包或者 xml.dom.minidom 模块中的 getDOMImplementation() 函数来获取。 一旦你获得了一个 Document,你就可以向它添加子节点来填充 DOM:

from xml.dom.minidom import getDOMImplementationimpl = getDOMImplementation()newdoc = impl.createDocument(None, "some_tag", None)
top_element = newdoc.documentElement
text = newdoc.createTextNode('Some textual content.')
top_element.appendChild(text)

一旦你得到了 DOM 文档对象,你就可以通过其属性和方法访问对应 XML 文档的各个部分。 这些属性定义在 DOM 规格说明当中;文档对象的主要特征属性是 documentElement。 它给出了 XML 文档中的主元素:即包含了所有其他元素的元素。 以下是一个示例程序:

dom3 = parseString("<myxml>Some data</myxml>")
assert dom3.documentElement.tagName == "myxml"

当你完成对一个 DOM 树的处理时,你可以选择调用 unlink() 方法来鼓励尽早清除已不再需要的对象。 unlink() 是针对 DOM API 的 xml.dom.minidom 专属扩展,它会将特定节点及其下级标记为不再有用。 在其他情况下,Python 的垃圾回收器将负责最终处理树结构中的对象。

参见

文档对象模型 (DOM) 第 1 层级规格说明

被 xml.dom.minidom 所支持的 W3C 针对 DOM 的建议。

DOM 对象

Python 的 DOM API 定义被作为 xml.dom 模块文档的一部分给出。 这一节列出了该 API 和 xml.dom.minidom 之间的差异。

Node.unlink()

破坏 DOM 的内部引用以便它能在没有循环 GC 的 Python 版本上垃圾回收器回收。 即使在循环 GC 可用的时候,使用此方法也可让大量内存更快变为可用,因此当 DOM 对象不再被需要时尽早调用它们的这个方法是很好的做法。 此方法只须在 Document 对象上调用,但也可以在下级节点上调用以丢弃该节点的下级节点。

你可以通过使用 with 语句来避免显式调用此方法。 以下代码会在 with 代码块退出时自动取消链接 dom:

with xml.dom.minidom.parse(datasource) as dom:... # Work with dom.

Node.writexml(writerindent=''addindent=''newl=''encoding=Nonestandalone=None)

将 XML 写入到写入器对象。 写入器接受文本而非字节串作为输入,它应当具有与文件对象接口相匹配的 write() 方法。 indent 形参是当前节点的缩进层级。 addindent 形参是用于当前节点的下级节点的缩进量。 newl 形参指定用于一行结束的字符串。

对于 Document 节点,可以使用附加的关键字参数 encoding 来指定 XML 标头的编码格式字段。

类似地,显式指明 standalone 参数将会使单独的文档声明被添加到 XML 文档的开头部分。 如果将该值设为 True,则会添加 standalone="yes",否则它会被设为 "no"。 未指明该参数将使文档声明被省略。

在 3.8 版更改: writexml() 方法现在会保留用户指定的属性顺序。

在 3.9 版更改: 增加了 standalone 形参。

Node.toxml(encoding=Nonestandalone=None)

返回一个包含 XML DOM 节点所代表的 XML 的字符串或字节串。

带有显式的 encoding 1 参数时,结果为使用指定编码格式的字节串。 没有 encoding 参数时,结果为 Unicode 字符串,并且结果字符串中的 XML 声明将不指定编码格式。 使用 UTF-8 以外的编码格式对此字符串进行编码通常是不正确的,因为 UTF-8 是 XML 的默认编码格式。

standalone 参数的行为与 writexml() 中的完全一致。

在 3.8 版更改: toxml() 方法现在会保留用户指定的属性顺序。

在 3.9 版更改: 增加了 standalone 形参。

Node.toprettyxml(indent='\t'newl='\n'encoding=Nonestandalone=None)

返回文档的美化打印版本。 indent 指定缩进字符串并默认为制表符;newl 指定标示每行结束的字符串并默认为 \n

encoding 参数的行为类似于 toxml() 的对应参数。

standalone 参数的行为与 writexml() 中的完全一致。

在 3.8 版更改: toprettyxml() 方法现在会保留用户指定的属性顺序。

在 3.9 版更改: 增加了 standalone 形参。

DOM 示例

此示例程序是个相当实际的简单程序示例。 在这个特定情况中,我们没有过多地利用 DOM 的灵活性。

import xml.dom.minidomdocument = """\
<slideshow>
<title>Demo slideshow</title>
<slide><title>Slide title</title>
<point>This is a demo</point>
<point>Of a program for processing slides</point>
</slide><slide><title>Another demo slide</title>
<point>It is important</point>
<point>To have more than</point>
<point>one slide</point>
</slide>
</slideshow>
"""dom = xml.dom.minidom.parseString(document)def getText(nodelist):rc = []for node in nodelist:if node.nodeType == node.TEXT_NODE:rc.append(node.data)return ''.join(rc)def handleSlideshow(slideshow):print("<html>")handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])slides = slideshow.getElementsByTagName("slide")handleToc(slides)handleSlides(slides)print("</html>")def handleSlides(slides):for slide in slides:handleSlide(slide)def handleSlide(slide):handleSlideTitle(slide.getElementsByTagName("title")[0])handlePoints(slide.getElementsByTagName("point"))def handleSlideshowTitle(title):print(f"<title>{getText(title.childNodes)}</title>")def handleSlideTitle(title):print(f"<h2>{getText(title.childNodes)}</h2>")def handlePoints(points):print("<ul>")for point in points:handlePoint(point)print("</ul>")def handlePoint(point):print(f"<li>{getText(point.childNodes)}</li>")def handleToc(slides):for slide in slides:title = slide.getElementsByTagName("title")[0]print(f"<p>{getText(title.childNodes)}</p>")handleSlideshow(dom)

minidom 和 DOM 标准

xml.dom.minidom 模块实际上是兼容 DOM 1.0 的 DOM 并带有部分 DOM 2 特性(主要是命名空间特性)。

Python 中 DOM 接口的用法十分直观。 会应用下列映射规则:

  • 接口是通过实例对象来访问的。 应用程序不应实例化这些类本身;它们应当使用 Document 对象提供的创建器函数。 派生的接口支持上级接口的所有操作(和属性),并添加了新的操作。

  • 操作以方法的形式使用。 因由 DOM 只使用 in 形参,参数是以正常顺序传入的(从左至右)。 不存在可选参数。 void 操作返回 None

  • IDL 属性会映射到实例属性。 为了兼容针对 Python 的 OMG IDL 语言映射,属性 foo 也可通过访问器方法 _get_foo() 和 _set_foo() 来访问。 readonly 属性不可被修改;运行时并不强制要求这一点。

  • short intunsigned intunsigned long long 和 boolean 类型都会映射为 Python 整数类型。

  • DOMString 类型会映射为 Python 字符串。 xml.dom.minidom 支持字节串或字符串,但通常是产生字符串。 DOMString 类型的值也可以为 None,W3C 的 DOM 规格说明允许其具有 IDL null 值。

  • const 声明会映射为它们各自的作用域内的变量 (例如 xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE);它们不可被修改。

  • DOMException 目前不被 xml.dom.minidom 所支持。 xml.dom.minidom 会改为使用标准 Python 异常例如 TypeError 和 AttributeError。

  • NodeList 对象是使用 Python 内置列表类型来实现的。 这些对象提供了 DOM 规格说明中定义的接口,但在较早版本的 Python 中它们不支持官方 API。 相比在 W3C 建议中定义的接口,它们要更加的 "Pythonic"。

下列接口未在 xml.dom.minidom 中实现:

  • DOMTimeStamp

  • EntityReference

这些接口所反映的 XML 文档信息对于大多数 DOM 用户来说没有什么帮助。

备注

1

包括在 XML 输出中的编码格式名称应当遵循适当的标准。 例如,"UTF-8" 是有效的,但 "UTF8" 在 XML 文档的声明中是无效的,即使 Python 接受其作为编码格式名称。 详情参见 https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl 和 Character Sets。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/217252.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】conda镜像配置,.condarc文件详解,channel镜像

1. conda 环境 安装miniconda即可&#xff0c;Miniconda 安装包可以到 http://mirrors.aliyun.com/anaconda/miniconda/ 下载。 .condarc是conda 应用程序的配置文件&#xff0c;在用户家目录&#xff08;windows&#xff1a;C:\users\username\&#xff09;&#xff0c;用于…

3-分布式存储之Ceph

任务背景 虽然使用了分布式的glusterfs存储, 但是对于爆炸式的数据增长仍然感觉力不从心。对于大数据与云计算等技术的成熟, 存储也需要跟上步伐. 所以这次我们选用对象存储. 任务要求 1, 搭建ceph集群 2, 实现对象存储的应用 任务拆解 1, 了解ceph 2, 搭建ceph集群 3, 了…

智能优化算法应用:基于差分进化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于差分进化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于差分进化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.差分进化算法4.实验参数设定5.算法结果6.…

智能守护,数据安全稳中求胜!上海迅软DSE助力家具家电行业引领潮流!

随着中国经济的蓬勃发展&#xff0c;家具家电企业正迎来“精品制造”的时代&#xff0c;业内竞争日益激烈。为了提升产品竞争力、扩大市场占有率&#xff0c;企业亟需加强对自主品牌的安全建设&#xff0c;确保品牌的自主知识产权、产品生产资料以及销售信息等核心数据不受泄漏…

如何部署Portainer容器管理工具+cpolar内网穿透实现公网访问管理界面

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

从零开发短视频电商 AWS OpenSearch Service开发环境申请以及Java客户端介绍

文章目录 创建域1.创建域2.输入配置部署选项数据节点网络精细访问控制访问策略 获取域端点数据如何插入到OpenSearch ServiceJava连接OpenSearch Servicespring-data-opensearchelasticsearch-rest-high-level-clientopensearch-rest-clientopensearch-java 因为是开发测试使用…

VSCode 配置自动生成头文件

相关文章 VSCode 开发C/C实用插件分享——codegeex VSCode 开发C/C实用插件分享——koroFileHeader VSCode 配置自动生成头文件 一、snippets二、配置步骤三、效果展示 一、snippets 相信大家对C、C都头文件都不陌生&#xff0c;都会发现每个头文件都会包括下面的这些格式&…

Bypass open_basedir

讲解 open_basedir是php.ini中的一个配置选项&#xff0c;可用于将用户访问文件的活动范围限制在指定的区域。 假设open_basedir/var/www/html/web1/:/tmp/&#xff0c;那么通过web1访问服务器的用户就无法获取服务器上除了/var/www/html/web1/和/tmp/这两个目录以外的文件。…

【洛谷算法题】P5717-【深基3.习8】三角形分类【入门2分支结构】Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5717-【深基3.习8】三角形分类【入门2分支结构】&#x1f30f;题目描述&#x1…

ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角

本节课的内容&#xff0c;就让我们来学习一下ArrayList集合的应用&#xff0c;ArrayList的本质就是一个顺序表&#xff0c;那下面一起来学习吧 目录 一、杨辉三角 1.题目详情及链接 2.剖析题目 3.思路及代码 二、洗牌算法 1.创造牌对象 2.创造一副牌 3.洗牌操作 4.发…

linux 定时任务

使用 crontab Usage: crontab [-u user] [-e|-l|-r] Crontab 的格式说明如下: * 逗号(‘,’) 指定列表值。如: “1,3,4,7,8″ * 中横线(‘-’) 指定范围值 如 “1-6″, 代表 “1,2,3,4,5,6″ * 星号 (‘*’) 代表所有可能的值 */15 表示每 15 分钟执行一次 # Use the ha…

异常检测 | 基于孤立森林(Isolation Forest)的数据异常数据检测(结合t-SNE降维可视化)

异常检测 | MATLAB实现基于孤立森林的数据异常检测 目录 异常检测 | MATLAB实现基于孤立森林的数据异常检测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于孤立森林(Isolation Forest)的数据异常数据检测可视化&#xff08;完整源码和数据) 基于孤立森林(…

Mac 如何删除文件及文件夹?可以尝试使用终端进行删除

MacOS 是 Mac 电脑采用的操作系统&#xff0c;你知道 Mac 如何删除文件吗&#xff1f;除了直接将文件或者文件夹拖入废纸篓之外&#xff0c;我们还可以采用终端命令的办法去删除文件&#xff0c;本文为大家总结了 Mac 删除文件方法。 为何使用命令行删除文件 在使用 Mac 电脑…

【c】数组元素移动

本题的难点之处就是不让你创建新的数组&#xff0c;而且移动的距离也没有给限制&#xff0c;比如有7个数&#xff0c;本题没有限制必须移动距离小于7&#xff0c;也可能移动的距离大于7&#xff0c;甚至更多&#xff0c;下面附上我的代码 #include<stdio.h>int main() {…

【五】Python 代理模式

文章目录 5.1 代理模式概述5.1.1 代理介绍5.1.2 代理模式的作用 5.2 代理模式的UML类图5.3 了解不同类型的代理5.3.1虚拟代理5.3.2 远程代理5.3.3 保护代理5.3.4 智能代理 5.4 现实世界中的代理模式5.5 代理模式的优点5.6 门面模式和代理模式之间的比较 5.1 代理模式概述 5.1.…

跟着我学Python基础篇:08.集合和字典

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…

Python爬虫之Cookie 与 Session 的区别

文章目录 一、 含义二、有效时长&#xff1a;三、面试中可能会遇到的问题点四、在反爬技术中的应用关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源…

【UE5】监控摄像头效果(下)

目录 效果 步骤 一、多摄像机视角切换 二、摄像头自动旋转巡视 三、摄像头跟踪拍摄 效果 步骤 一、多摄像机视角切换 1. 打开玩家控制器“MyPlayerController”&#xff0c;添加一个变量&#xff0c;命名为“BP_SecurityCameraArray”&#xff0c;类型为“BP_SecurityCa…

Ganache结合内网穿透实现远程或不同局域网进行连接访问

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络&#xff0c;提供图形化界面&#xff0c;log日志等&#xff1b;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…

小红书民宿文案怎么写?建议收藏

随着民宿市场的日益火爆&#xff0c;如何在众多民宿中脱颖而出&#xff0c;吸引更多租客入住&#xff0c;成为摆在每一位民宿业主面前的难题。一篇优质的小红书民宿文案&#xff0c;不仅能吸引潜在租客的关注&#xff0c;还能提高民宿的知名度。本文伯乐网络传媒将从八个方面教…