Python 标准库之 xml.etree.ElementTree

Python中有多种xml处理API,常用的有xml.dom.*模块、xml.sax.*模块、xml.parser.expat模块和xml.etree.ElementTree模块(以下简称ET)。本文将主要介绍ET的使用,以及它的常用函数。其它模块的简介,请参照文献[1]。
ET使用Element表示xml中的节点、文本、注释等。其主要属性如下:
tag:string对象,表示数据代表的种类,当为节点时为节点名称。

text:string对象,表示element的内容。

attrib:dictionary对象,表示附有的属性。

tail:string对象,表示element闭合之后的尾迹。

若干子元素(child elements)。

<tag attrib1=1>text</tag>tail
1     3            2             4
PS: ET模块对于那些恶意构造的数据并不是安全的,如果需要解析数据最好了一下xml的弱点[2]
一、导入ET
在Python标准库中,ElementTree有两种实现方式:一种是纯Python的实现xml.etree.ElementTree,另一种是速度更快一点的xml.etree.cElementTree。如果不确定环境中是否有cElementTree,可以使用如下的方式导入:
try:import xml.etree.cElementTree as ET
except ImportError:import xml.etree.ElementTree as ET

但从Python 3.3开始,会默认使用cElementTree来加快速度,但是之前的版本最好使用如上的代码,以提高代码的兼容性。
二、解析xml
假设我们现在有如下的xml
<?xml version="1.0"?>
<data><country name="Liechtenstein"><rank>1</rank><year>2008</year><gdppc>141100</gdppc><neighbor name="Austria" direction="E"/><neighbor name="Switzerland" direction="W"/></country><country name="Singapore"><rank>4</rank><year>2011</year><gdppc>59900</gdppc><neighbor name="Malaysia" direction="N"/></country><country name="Panama"><rank>68</rank><year>2011</year><gdppc>13600</gdppc><neighbor name="Costa Rica" direction="W"/><neighbor name="Colombia" direction="E"/></country>
</data>

有两种方式可以解析xml
1. 从文件中解析xml文件
>>> import xml.etree.cElementTree as ET
>>> tree = ET.ElementTree(file='doc1.xml')     #载入数据
>>> root = tree.getroot()     #获取根节点
<Element 'doc' at 0x11eb780>

2. 从内存字符串中解析xml
root = ET.fromstring(country_data_as_string)

其中第二种方式可以直接过去根节点。
三、数据的访问
>>> for child in root:
...   print child.tag, child.attrib
...
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}

或者直接使用索引寻找子节点:

>>> root[0][1].text
'2008'

或者使用xpath方式进行遍历,但其支持部分xpath方法,其支持的xpath请参照[4]
>>> root.findall("./country/neighbor")
[<Element 'neighbor' at 0x14fa0f0>, <Element 'neighbor' at 0x14fa150>, <Element 'neighbor' at 0x14fa3f0>, <Element 'neighbor' at 0x14fa6c0>, <Element 'neighbor' at 0x14fa750>]

四、 处理xml流
如下的程序将从xml文件中一边读入xml一边解析,并将在遇到标签开始或标签结束的时候返回相应的事件。
for event, elem in ET.iterparse(sys.argv[2]):if event == 'end':if elem.tag == 'location' and elem.text == 'Zimbabwe':count += 1elem.clear() # discard the element

这个程序将在检查到标签结束的时候,对指定的标签进行计数。最后的elem.clear()保证了,在解析的之后尽快的释放内存。
五、Element对象
class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

tag:string 元素代表的数据种类。
text:string 元素的内容。
tail:string 元素的尾形。
attrib:dictionary 元素的属性字典。

#针对属性的操作
clear() 清空元素的后代、属性、text和tail也设置为None。
get(key, default=None) 获取key对应的属性值,如该属性不存在则返回default值。
items() 根据属性字典返回一个列表,列表元素为(key, value)。
keys() 返回包含所有元素属性键的列表。
set(key, value) 设置新的属性键与值。

#针对后代的操作
append(subelement) 添加直系子元素。
extend(subelements) 增加一串元素对象作为子元素。#python2.7新特性
find(match) 寻找第一个匹配子元素,匹配对象可以为tag或path。
findall(match) 寻找所有匹配子元素,匹配对象可以为tag或path。
findtext(match) 寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
insert(index, element) 在指定位置插入子元素。
iter(tag=None) 生成遍历当前元素所有后代或者给定tag的后代的迭代器。#python2.7新特性
iterfind(match) 根据tag或path查找所有的后代。
itertext() 遍历所有后代并返回text值。
remove(subelement) 删除子元
素。

六、ElementTree对象
class xml.etree.ElementTree.ElementTree(element=None, file=None)element如果给定,则为新的ElementTree的根节点。

_setroot(element):用给定的element替换当前的根节点。慎用。

# 以下方法与Element类中同名方法近似,区别在于它们指定以根节点作为操作对象。
find(match)
findall(match)
findtext(match, default=None)
iter(tag=None)
iterfind(match)
parse(source, parser=None) 装载xml对象,source可以为文件名或文件类型对象
getroot() 获取根节点
write(file, encoding=“us-ascii”, xml_declaration=None, default_namespace=None,method=“xml”)

七、模块方法-->用于生成xml文件
1. 创建一个特别的element,通过标准序列化使其代表了一个comment。comment可以为bytestring或unicode。
     ET.Comment(text=None)

2. 生成一个element tree,通过sys.stdout输出,elem可以是元素树或单个元素。这个方法最好只用于debug。

     ET.dump(elem)
3. text是一个包含XML数据的字符串,与XML()方法类似,返回一个Element实例。

     ET.fromstring(text)

4. 从字符串的序列对象中解析xml文档。缺省parser为XMLParser,返回Element实例。V2.7中新加属性

     ET.fromstringlist(sequence, parser=None)

5. 检查是否是一个element对象。

     ET.iselement(element)

6. 将文件或包含xml数据的文件对象递增解析为element tree,并且报告进度。events是一个汇报列表,如果忽略,将只有end事件会汇报出来。
注意,iterparse()只会在看见开始标签的">"符号时才会抛出start事件,因此届时属性是已经定义了,但是text和tail属性在那时还没有定义,同样子元素也没有定义,因此他们可能不能被显示出来。如果你想要完整的元素,请查找end事件。

     ET.iterparse(source, events=None, parser=None)

7. 将一个文件或者字符串解析为element tree。

     ET.parse(source, parser=None)

8. 这个方法会创建一个特别的element,该element被序列化为一个xml处理命令。

     ET.ProcessingInstruction(target, text=None)

9. 注册命名空间前缀。这个注册是全局有效,任何已经给出的前缀或者命名空间uri的映射关系会被删除。 V2.7新加属性

     ET.register_namespace(prefix, uri)

10. 子元素工厂,创建一个Element实例并追加到已知的节点。

     ET.SubElement(parent, tag, attrib={}, **extra)

11. 生成一个字符串来表示表示xml的element,包括所有子元素。element是Element实例,method为"xml", "html", "text"。 返回包含了xml数据的字符串。

     ET.tostring(element, encoding="us-ascii", method="xml")

12. 生成一个字符串来表示表示xml的element,包括所有子元素。element是Element实例,method为"xml","html","text"。返回包含了xml数据的字符串列表。V2.7新添加属性

     ET.tostringlist(element, encoding="us-ascii", method="xml")

13. 从一个字符串常量中解析出xml片段。返回Element实例。

     ET.XML(text, parser=None)

14. 从字符串常量解析出xml片段,同时返回一个字典,用以映射element的id到其自身。

     ET.XMLID(text, parser=None)

每天一点点,感受自己存在的意义。
分类: Python
标签: Python
<div id="blog_post_info">
好文要顶 关注我 收藏该文

疯了的小蜗
关注 - 70
粉丝 - 198

+加关注
1
0
<div class="clear"></div>
<div id="post_next_prev"><a href="https://www.cnblogs.com/insane-Mr-Li/p/9952827.html" class="p_n_p_prefix">« </a> 上一篇:    <a href="https://www.cnblogs.com/insane-Mr-Li/p/9952827.html" title="发布于 2018-11-13 16:16">python configparser模块</a>
<br>
<a href="https://www.cnblogs.com/insane-Mr-Li/p/9964249.html" class="p_n_p_prefix">» </a> 下一篇:    <a href="https://www.cnblogs.com/insane-Mr-Li/p/9964249.html" title="发布于 2018-11-15 16:16">python的ConfigParser模块</a>

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190919135954466.jpg)

Python 标准库之 xml.etree.ElementTree xml解析相关推荐

  1. python etree库_python 标准库之xml.etree.ElementTree

    简介 Element类型是一种灵活的容器对象,用于在内存中存储结构化数据. [注意]xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全. 每个element对象都具有以下属 ...

  2. xml 属性value换行显示_python 标准库之xml.etree.ElementTree

    简介 Element类型是一种灵活的容器对象,用于在内存中存储结构化数据. [注意]xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全. 每个element对象都具有以下属 ...

  3. Python标准库之xml.etree.ElementTree

    1     2        3         4 创建元素的方法有Element或者SubElement(),前者称作元素的构建函数(constructor),用以构建任一独存的元素: 后者称作元 ...

  4. Python 标准库之 XML(下)

    本文作者:Rocky0249 公众号:Python空间 写在之前 隔了1天了,不知道你们还记得上一篇文章的内容不,如果不记得的话请移步 -- Python 标准库之 XML(上). 今天我们继续来学习 ...

  5. python xml etree_python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别和基本使用...

    1.解析速度:ElementTree在 Python 标准库中有两种实现.一种是纯 Python 实现例如 xml.etree.ElementTree ,另外一种是速度快一点的 xml.etree.c ...

  6. python【模块】xml.etree.ElementTree 解析 xml

    pytho 模块 xml.etree.ElementTree 解析 xml 文章目录 pytho 模块 xml.etree.ElementTree 解析 xml 1. 什么是 XML? 2. Elem ...

  7. [PYTHON] xml.etree.ElementTree 实例

    2019独角兽企业重金招聘Python工程师标准>>> --------------------------------------------------------------- ...

  8. 干货 | Python 标准库之 XML(上)

    本文作者:Rocky0249 公众号:Python空间 写在之前 带分隔符的文件仅有两维的数据:行 & 列.如果我们想在程序之间交换数据结构,需要一种方法把层次结构,序列,集合和其它的数据结构 ...

  9. python 打印xml文档树_[Python]xml.etree.ElementTree处理xml文档

    需求: 在实际应用中,需要对xml配置文件进行实时修改, 1.增加.删除 某些节点 2.增加,删除,修改某个节点下的某些属性 3.增加,删除,修改某些节点的文本 xml源文件格式[例] path=&q ...

最新文章

  1. 手撸一个JdbcTemplate,带你了解其原理
  2. 类别不平衡问题 —— 各种评估指标
  3. Orleans—一些概念
  4. 铜仁计算机专业学校,听说计算机专业的在本部啊 这是真的么
  5. 转一篇写的比较好的camera文档[Camera 图像处理原理分析]
  6. centos镜像 from_下载 CentOS 7 镜像文件
  7. RedHat 7配置keepalived+LVS实现高可用的Web负载均衡
  8. appium 环境配置
  9. java正则表达式爬图片_Java正则表达式爬取网页,贴出完整代码
  10. 《软件企业的管理与文化》读后感
  11. 二叉树的遍历--递归+非递归(两种)
  12. alter table add column多个字段_element中el-table单行暂无数据和整体暂无数据的默认修改...
  13. 稳定币usda是哪个发行的_什么是USDA?_USDA币介绍_USDA币种百科_创始团队和代币总量_蜜蜂查...
  14. 用友-凭证打印行数如何调整
  15. php实现前后端完全分离
  16. 《TCP/IP详解 卷1:协议》学习笔记(未完待续)
  17. java接口对带宽的要求,常见的接口带宽分析
  18. iOS 模拟微信内置浏览器CYWebViewController
  19. (vcom-1141) Identifier “<protected>“ does not identify a component declaration.
  20. Ubuntu kylin 14.04下的spark1.0.1安装

热门文章

  1. 2022-2028年中国石化行业节能减排投资分析及前景预测报告
  2. debian 10 ssh简单配置
  3. hadoop问题小结
  4. 数据类型转换pytorch
  5. torch.nn.Embedding
  6. Java集合之并发容器
  7. Jenkins首次安装推荐插件出错 No such plugin: cloudbees-folder 超详细解决方案
  8. 低代码技术与市场(Mendix与 OutSystems)
  9. 适用于Windows和Linux的Yolo-v3和Yolo-v2(上)
  10. 自然语言推理:微调BERT