ElementTree之Xml文档处理
- ElementTree: 表示整个XML层级结构
- Element: 表示树形结构中所有的父节点
- SubElement: 表示树形结构中所有的子节点
有些节点既是父节点,又是子节点
下面来看下这两个类的定义及其提供的函数:
Element类
class xml.etree.ElementTree.Element(tag, attrib={}, **extra)
Element类对应的是树形结构中的每个节点,对应的是XML文档中的标签对。我们上面提到过XML标签有以下几个特征,除了子标签外都有相应的属性与之对应:
标签特征 | 对应的类属性 | 数据类型 |
---|---|---|
标签名称 | tag | 字符串 |
属性 | attrib | 字典,所有属性和属性值的集合 |
标签值 | text | 通常是字符串 |
与下一个标签之间的值 | tail | 通常是字符串 |
子标签 | 无 | 标签的父子关系是在SubElement中指定的 |
关于Element.text和Element.tail属性的说明:
- 它们可被用于保存于该Element相关的额外数据;
- 它们的值通常是字符串,但是也可以是任何应用特定的对象类型;
- 如果Element对象是由一个XML创建而来的,那么
text
属性保存的是这个element的开始标签与它的第一个子标签或结束标签之间的文本,或者是None;而tail保存的是这个element的结束标签与下一个标签之间的文件或None,可以看下面的例子。
<a><b>1<c>2<d/>3</c></b>4</a>
- element a 的text和tail属性值都是None;
- element b 的text属性值是1,tail属性值是4;
- element c 的text属性值是2, tail属性值是None;
- element d 的text属性值是None, tail的属性值是3;
Element类中用于操作标签属性attrib的方法(类似于字典的方法):
# 以一个(name, value)的序列的形式返回该element所有属性,且属性在序列是随机的
items()
# 返回该element所有属性的名称列表,属性名称顺序随机
keys()
# 获取该element指定属性key的值
get(key, default=None)
# 设置该element指定属性的值
set(key, value)
# 重置当前element:删除所有的 subelemnts、清空所有属性、设置text和tail属性值为None
clear()
Element类中用于操作子标签(subelement)的方法:
# 向最后添加一个子标签
append(subelement)
# 向最后追加多个子标签,subelements是一个Element序列;这是Python 3.2中新增的方法
extends(subelements)
# 像该element的指定位置插入一个subelement
insert(index, subelement)
# 返回第一个与match匹配的subelement或None,match可以是一个tag名称(标签名称),也可以是一个path
find(match, namespaces=None)
# 返回所有与match匹配的subelement列表或None,match可以是一个tag名称(标签名称),也可以是一个path
findall(match, namespaces=None)
# 返回第一个与match匹配的subelement的text属性值,如果匹配到的element没有text属性则返回一个空字符串,如果没有匹配到subelement则返回default参数定义的值
findtext(match, default=None, namespaces=None)
# Python 3.2开始已将该方法废弃,请使用list(elem)或迭代
getchildren()
# Python 3.2开始已将该方法废弃,改用Element.iter()
getiterator(tag=None)
# 这是Python 3.2中新增的方法。以当前element作为根创建一个tree迭代器,该迭代器会议深度优先的方式迭代这个element及其下面的所有elements。如果tag不是None或'*',则只有tag值等于tag参数所指定值的element才会被这个迭代器返回;如果树形结构在迭代过程中被修改,则结果为undefined。
iter(tag=None)
# 这是Python 3.2中新增的方法。查找与match参数指定的tag名称或path相匹配的所有subelements,返回一个以文档顺序产生所有匹配element的可迭代对象。
iterfind(match, namespaces=None)
# 这是Python 3.2中新增的方法。创建一个迭代器,这个迭代器以文档顺序循环当前element和所有subelements并返回所有内部文本。
itertext()
# 从当前element中移除指定的subelement
remove(subelement)
SubElement类
SubElement(parent, tag, attrib={}, **extra)
parent参数表示父节点(标签对),它应该是一个Element类的实例。SubElement的其他属性和函数与Element相同。
ElementTree类
ElementTree表示的是整个element层级关系,并且该类还添加了一些对标准XML序列化和反序列化的额外支持。
class xml.etree.ElementTree.ElementTree(element=None, file=None)
element: 是一个Element实例,表示root element;
file: 是一个XML文件文成,如果该参数被给出,则会以该文件的内容初始化树形层次结构;
下面是ElementTree提供的方法:
# 以指定的element实例替换当前tree的root element,相当于把整个XML的内容替换掉了
_setroot(element)
# 返回当前树形层级结构的root element
getroot()
# 与Element.find()功能相同,只是它是从树形结构的root element开始查找
find(match, namespaces=None)
# 与Element.findall()功能相同,只是它是从树形结构的root element开始查找
findall(match, namespaces=None)
# 与Element.findtext()功能相同,只是它是从树形结构的root element开始查找
findtext(match, default=None, namespaces=None)
# Python 3.2开始已将该方法废弃,改用ElementTree.iter()
getiterator(tag=None)
# Python 3.2新增的方法。为当前root element创建并返回一个树迭代器,该迭代器将会按顺序循环这个树形结构的中的所有与tag匹配的elements,默认返回所有elements
iter(tag=None)
# Python 3.2新增的方法。与Element.iterfind()功能相同,只是它是从树形结构的root element开始查找
iterfind(match, namespaces=None)
# 加载一个外部XML片断到当前element树并返回该XML片断的root element。source是一个文件名称或文件对象。parser是一个可选的parser实例,如果没有给出该参数,将会使用标准的XMLParser解析器。
parse(source, parser=None)
# 将当前element tree以XML形式写入一个文件中。
# file 是一个文件名称或一个以写模式打开的文件对象
# encoding 用于指定输出编码
# xml_declaration 用于控制师傅将一个XML声明也添加到文件中(False表示添加、True表示不添加、None表示只有编码不是"US-ASCII"或"UTF-8"或"Unicode"时才添加)
# default_namespace 设置默认的XML命名空间(“xmlns”)
# method 可取值为"xml"、"html"和"text",默认为"xml"
# short_empty_elements 是唯一一个关键字参数,是Python 3.4新增加的参数。它用于控制那些不包含任何内容的elements的格式,如果该参数值为Ture则这些标签将会被输出为一个单独的自关闭标签(如: <a/>),如果值为False则这些标签将会被输出为一个标签对(如:<a></a>)
write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml", *, short_empty_elements=True)
注意:
write()方法的输出可以是一个字符串(str),可以可以是二进制(bytes)。这是受encoding参数控制的:
- 如果encoding参数值为"unicode",则输出是一个字符串;
- 否则,输出时二进制字节。
如果file是一个(以可写模式)打开的文件对象,这有可能会发生冲突。因此,我们需要确定不会尝试将一个字符串写入一个二进制流,反之亦然。
3. xml.etree.ElementTree模块提供的函数
xml.etree.ElementTree模块也直接提供了一些函数便于我们直接对XML进行操作,下面来介绍几个常用的函数:
# 解析包含XML数据的字符串,返回一个Element实例
xml.etree.ElementTree.fromstring(text)
# 生成并返回指定的Element实例对应的包含XML数据的字符串(encoding="unicode")或字节流
# 参数讲解请参考上面的ElementTree类的write()方法
xml.etree.ElementTree.toString(element, encoding="us-ascii", method="xml", *, short_empty_elements=True)
# 解析包含XML数据的文件名或文件对象,返回一个ElementTree实例
xml.etree.ElementTree.parse(source, parser=None)
# 将XML数据以递增的方式解析到元素树中,并向用户报告发生了什么(类似SAX的回调机制),最终返回一个提供(event, elem)对的迭代器(iterator)。
# source 是一个包含XML数据的文件名称或文件对象
# events 是一个包含要报告的事件序列,这里支持的事件包括:"start"、"end"、"start-ns"、"end-ns"(“ns”事件用于获取详细的命名空间信息)。如果event参数被省略,则仅报告"end"事件。
# parser是一个可选的解析器实例,如果为给出则使用标准的XMLParser解析器
xml.etree.ElementTree.iterparse(source, events=None, parser=None)
关于xml.etree.ElementTree.iterparse()方法的说明:
- 虽然它以递增的方式构建元素树,但是它仍然会锁定对source的读取操作。因此,它不适用于不能接受读阻塞的应用。
- 它只保证在发出一个“start”事件时,它已经看到了起始标签(tag)的">"结束字符,因此此时它定义了atrrib属性,但是text和tail属性的内容在那一时刻是没有被定义的(这同样适用于子元素)。如果你需要一个完全填充的元素,请查找“end”事件。
ElementTree之Xml文档处理的更多相关文章
- Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)
本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 一.前言 我们在<中我们描述了Python数据持久化的大体概念和基本处理方式,通过这些知识点我们已经 ...
- 【转】Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)
[转]Python之xml文档及配置文件处理(ElementTree模块.ConfigParser模块) 本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 ...
- python+selenium自动化软件测试(第12章):Python读写XML文档
XML 即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言.xml 有如下特征: 首先,它是有标签对组成:<aa></aa> ...
- 自动创建xml文档
自动创建xml文档 import xml.etree.ElementTree as ET print(dir(ET)) #ET里面有Element方法 root = ET.Element(" ...
- C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...
- 【.net 深呼吸】使用二进制格式来压缩XML文档
在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小. XmlDicti ...
- 【Win 10应用开发】把文件嵌入到XML文档
把文件内容嵌入(或存入)到XML文档中,相信很多朋友会想到把字节数组转化为Base64字符串,再作为XML文档的节点.不过,有人会说了,转化后的base64字符串中含有像“+”这样的符号,写入到XML ...
- 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……
大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果 ...
- 【Win10 应用开发】自适应Toast通知的XML文档结构
老规矩,在开始之前老周先讲个故事. 话说公元2015年7月20日,VS 2015发布.于是,肯定有人会问老周了,C#6有啥新特性,我学不来啊.学不来的话你应该检讨.老周比较保守地计算一下,学会C# 6 ...
随机推荐
- centos配置jdk的环境变量
1.首先呢,centos下的JDK环境配置分两种情况,一直是root用户级别的jdk配置,另一种是其他用户组级别的配置.这里讲解的是root用户级别的配置. 我们已经下载解压好了jdk的目录.如下 2 ...
- 理解 Dubbo SPI 扩展机制
写在前面 最近接触了 gRPC 体会到虽然众多 RPC 框架各有各的特点但是他们提供的特性和功能有很多的相似之处 , 这就说明他们面对同样的分布式系统带来的问题.从 2016 年左右开始接触到 dub ...
- 20145329 《Java程序设计》第三周学习总结
教材学习内容总结 java并非完整的面向对象程序语言 定义 1:class:定义类 2.char:类型声明变量 3.new:新建对象 4.名称 X:参考 5.=:可用于指定参考至新建变量 6.构造函数 ...
- 20135320赵瀚青LINUX内核分析第三周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周是学习的主要是构造 ...
- PostgreSQL 递归查询 (转)
数据库中的数据存在父子关系(单继承,每一条记录只有一个父亲). 如果要查询一条记录以及他的所有子记录,或者要查询一条记录以及他的所有父记录.那么递归查询就再合适不过了.可以简化复杂的SQL语句 现在 ...
- Jquery12 Ajax
学习要点: 1.Ajax 概述 2.load()方法 3.$.get()和$.post() 4.$.getScript()和$.getJSON() 5.$.ajax()方法 6.表单序列化 Ajax ...
- HTTP协议Keep-Alive模式详解和HTTP头字段总结
1.什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HT ...
- 拓扑排序(dfs)
int c[N];//c[u]=0表示从来没有访问过:c[u]=1表示已经访问过,并且还递归访问过它的所有子:c[u]=-1表示正在访问. int topo[N],t; int G[N][N]; bo ...
- 利用shell编程,部署项目到服务器
现在在前后端分离的开发形式中,每次前端将VUE项目打包之后,需要后端程序员部署到服务器上.这过程为何没有用git,因为每次vue打包后的文件都不相同与前一次打包,git为何的话,会包含过大迭代版本,同 ...
- 决策树的剪枝,分类回归树CART
决策树的剪枝 决策树为什么要剪枝?原因就是避免决策树“过拟合”样本.前面的算法生成的决策树非常的详细而庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的.因此用这个决策树来 ...