Python中xml.etree.ElementTree读写xml文件实例
import os
import xml.etree.ElementTree as ET
'''
Python 标准库中,提供了6种可以用于处理XML的包,本文举实例说明第6种
1.xml.dom
2.xml.dom.minidom
3.xml.dom.pulldom
4.xml.sax
5.xml.parse.expat
6.xml.etree.ElementTree(简称ET)
xml 文件的内容
<user>
<name title="xml example">It is an xml example</name>
<article name="My article">
<algorithm name="a1">
<interval name="n1">1000</interval>
</algorithm>
</article>
<article name="Your article">
<algorithm name="a2">
<interval name="n2">1001</interval>
</algorithm>
</article>
<profile>
<profile-name>profile_hard_easy</profile-name>
<level>
<level-value>1</level-value>
<level-type>hard</level-type>
</level>
<level>
<level-value>2</level-value>
<level-type>easy</level-type>
</level>
</profile>
</user>
#获取当前文件所在目录
print(os.path.dirname(__file__))
#路径拼接,得到xml 文件的路径
dirpath = os.path.join(os.path.dirname(__file__),"test2.xml")
#用ET.ElementTree 读取xml文件,将xml文件解析为tree
'''
ET提供了两个对象ElementTree将整个XML文档转化为树, Element则代表着树上的单个节点。对整个XML文档的交互(读取,写入,查找需要的元素),一般是在 ElementTree层面进行的。对单个XML元素及其子元素,则是在 Element层面进行的。
'''
tree = ET.ElementTree(file=dirpath)
#获取xml 文件的根结点
root = tree.getroot()
#xml 的根结点是一个Element 对象.
'''
Element 对象常用的属性有:
Element.tag --输出标签的名称
Element.text --输出标签包含的内容
Element.attrib --标签的属性
'''
print(root) #输出: <Element 'user' at 0x000001C02A2DB818>
#查看xml根结点root的属性
print(root.tag,root.attrib) #输出: user {}, 根结点没有属性
#可以通过递归方式,遍历根结点的所有子元素,获取数中所有的元素
for child_root in root:
print(child_root.tag,child_root.text,child_root.attrib)
'''
输出:
name
{}
article
{'name': 'My article'}
profile
{}
'''
#根据索引访问特定的子元素
print(root[1].tag,root[1].text,root[1].attrib)
'''
输出:
article
{'name': 'My article'}
'''
#使用ElementTree iter() 方法遍历 tree的所有元素
for elem in root.iter():
print(elem.tag,elem.attrib)
if elem.tag == "profile":
print("=========Find it, I can do what I want")
#使用ElementTree iter() 方法,遍历指定tag的元素,找到自己感兴趣的属性
for sub_elem in root.iter(tag="article"):
print(sub_elem.tag,sub_elem.attrib)
#通过XPath 查找元素
'''
ElementTree 对象常用到的方法如下,它们的相同点是接收Xpath路径作为参数,不同点是
1. find 返回第一个匹配的子元素
2. findall 以列表的形式返回所有匹配的子元素
3. iterfind 则返回一个所有匹配元素的迭代器(iterator)
Xpath 使用例子:
1. 返回所有tag为article的元素:
findall("article")
2. 返回 tag为article下之下所有tag为algorithm的元素,注意格式必须为 父节点/一代子节点,而不能为父节点/二代子节点,比如article/interval 就会找不到
findall(article/algorithm)
'''
'''
1. find 输出:
algorithm
{}
'''
for elem in root.find("article"):
print(elem.tag,elem.text,elem.attrib)
'''
2. findall 和 iterfind 输出:
article
{'name': 'My article'}
article
{'name': 'Your article'}
'''
for elem in root.findall("article"):
print(elem.tag,elem.text,elem.attrib)
for elem in root.findall("article"):
print(elem.tag,elem.text,elem.attrib)
#生成和更改xml 文件
'''
ElementTree对象的write方法可以往xml写入内容
'''
#为根节点的第一个子元素增加属性 color=red
print(root[0].tag,root[0].attrib) #name {'title': 'xml example'}
root[0].set("color","red")
print(root[0].tag,root[0].attrib) #name {'title': 'xml example', 'color': 'red'}
#删掉根节点的其中一个子元素
i=0
for item in root:
print(i,item.tag)
i=i+1
del root[4] #删掉最后一个子元素 foot
i=0
for item in root:
print(i,item.tag)
i=i+1
#将修改后的文件写入到一个新的文件 test3.xml,新文档的元素属性顺序与原文档不同。这是因为ET是以字典的形式保存属性的,而字典是一个无序的数据结构。同时 XML也不关注属性的顺序,故乱序的影响不大
tree.write(os.path.join(os.path.dirname(__file__),"test3.xml"))
#构建一个新的xml文件
#生成根元素
root=ET.Element("root")
#生成子元素 A
a=ET.Element("A")
#增加元素A的子元素 child1
a_child=ET.SubElement(a,"child1")
a_child.text="I'm child of A"
#增加元素A的子元素 child2
a_child1=ET.SubElement(a,"child2")
#生成子元素B
b=ET.Element("B")
#增加元素B的子元素child1
b_child=ET.SubElement(b,"child1")
b_child.text="I'm child of B"
b_child.set("name","book") #set() 接收的是 key,value 形式
#将a和b 组成一个元组传入extend()方法中,元素 A和B作为根元素的子元素
root.extend((a,b))
trees=ET.ElementTree(root)
#将trees 写入到文件 test4.xml, 内容为 <root><A><child1>I'm child of A</child1><child2 /></A><B><child1 name="book">I'm child of B</child1></B></root>
trees.write(os.path.join(os.path.dirname(__file__),"test4.xml"))
Python中xml.etree.ElementTree读写xml文件实例的更多相关文章
- python3.x中xml.etree.ElementTree解析xml举例
1.新建xml import xml.etree.ElementTree as ETa=ET.Element('elem')c=ET.SubElement(a,'child1')c.text=&quo ...
- python xml.etree.ElementTree解析xml文件获取节点
<?xml version = "1.0" encoding = "utf-8"?> <root> <body name=&quo ...
- hdf 5文件格式及python中利用h5py模块读写h5文件
h5文件格式,HDF 的版本 5(HDF 版本 5不与 HDF 版本 4 及早期版本兼容).HDF是什么呢?就是Hierarchical Data Format,可以存储不同类型的图像和数码数据的文件 ...
- python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别和基本使用
1.解析速度:ElementTree在 Python 标准库中有两种实现.一种是纯 Python 实现例如 xml.etree.ElementTree ,另外一种是速度快一点的 xml.etree.c ...
- python xml.etree.ElementTree模块
使用的XML文件如下:file.xml <?xml version="1.0"?> <data name="ming"> <cou ...
- Python 标准库之 xml.etree.ElementTree
Python 标准库之 xml.etree.ElementTree Python中有多种xml处理API,常用的有xml.dom.*模块.xml.sax.*模块.xml.parser.expat模块和 ...
- [python 学习] 使用 xml.etree.ElementTree 模块处理 XML
---恢复内容开始--- 导入数据(读文件和读字符串) 本地文件 country_data.xml <?xml version="1.0"?> <data> ...
- python标准库xml.etree.ElementTree的bug
使用python生成或者解析xml的方法用的最多的可能就数python标准库xml.etree.ElementTree和lxml了,在某些环境下使用xml.etree.ElementTree更方便一些 ...
- python 之xml.etree.ElementTree
Element类型是一种灵活的容器对象,用于在内存中存储结构化数据. [注意]xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全. 每个element对象都具有以下属性: ...
随机推荐
- (Py练习)判断101-200之间的素数个数并输出
判断素数的方法之一:用一个数分别去除以2到squrt(这个数),如果能被整除,则不是素数. import math h = 0 leap = 1 for m in range(101, 201): k ...
- 一、HttpRunner学习汇总
HttpRunner是一款面向Http和HTTPS协议的通用测试框架,只需编写维护一份YAML/JSON脚本即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求,是基于关键字驱动的框架,基于 ...
- IP子网划分与聚合
一:IP地址: IP地址是由32位2进制数组成,每8位一组.由点分十进制表达. IP地址可以分为五类 A类(1.0.0.0-126.255.255.255),127.0.0.1 为本地回环地址. B类 ...
- 【BUAA软工】Alpha阶段测试报告
vLab-online项目Alpha阶段测试报告 项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:Alpha阶段测试报告 测试报告 测试发现的bug 在测试过程中发现了多少Bug? 我 ...
- Redis 分布式锁|从青铜到钻石的五种演进方案
缓存系列文章: 缓存实战(一):20 图 |6 千字|缓存实战(上篇) 缓存实战(二):Redis 分布式锁|从青铜到钻石的五种演进方案 缓存实战(三):分布式锁中的王者方案 - Redisson 上 ...
- Java集合,扑克牌的小项目练习
Java集合,扑克牌的小项目练习 2小时学完了类与集合,一直二倍加跳过,集合和类的学习我觉得得多实践中去记住,光靠背,永远也背不完,学的时候记一下常用的,特殊的就行了,用的时候再查,多写代码才能会,哈 ...
- Markdown使用概述
Markdown使用概述 序言 作为一名编程学习的爱好者和初学者,由于学习编程的过程中总是存在遗忘以及很难动手写起来的问题,所以在看了许多关于编程学习方法的文章之后,选择使用typora作为我的笔记工 ...
- MD5加密以及登录获取设置token
MD5简介 MD5是不可逆的加密算法,基本上是不可破解的,网上有些破解网站,其实是利用了穷举法,因为MD5生成的串是一样的,他们会将常规的密码生成MD5加密串,保存,然后破解的时候去穷举比对.(应对之 ...
- RHEL高级磁盘管理—Stratis
2. Stratis 本地存储管理工具,通过Stratis可以便捷的使用Thin Provisioning.Snapshots.Pool-based的管理和监控等高级存储功能. Stratis 基于x ...
- sed -i '14s/yes/no/' tftp
修改tftp 内容 # cd /etc/xinetd.d/[root@localhost xinetd.d]# cp tftp tftp.bak[root@localhost xinetd.d]# c ...