(十五)xml模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。
xml的格式如下,就是通过<>节点来区别数据结构的:
<?xml version="1.0"?>
<data> #父标签data
<country name="china"> #子标签country 属性name="china"
<rank updated="yes">2</rank> #子子标签rank 属性update="yes" 内容2
<year>2018</year>
</country>
</data>
xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml:
import xml.etree.ElementTree as et #xml模板应该是最长的的模板了,可以用as简写为et(自定义)
tree = et.parse('xml_lesson.xml') #用parse()方法来解析xml文件,拿到tree这个对象
root = tree.getroot() #getroot()拿到根节点
print(root.tag) #根节点的标签:data for i in root: #遍历一级子节点,即<country name='china'>
print(i.tag) #子节点的标签:country
print(i.attrib) #子节点的属性:{'name': 'china'}
print(i.text) #子节点的内容:无,但实际上是一行空行,注意看下面的结果 for j in i: #遍历二级子节点,即<rank updated="yes">2</rank>和<year>2018</year>
print(j.tag) #rank、year
print(j.attrib) #{'updated': 'yes'}、{}
print(j.text) #2、2018
结果:
data
country
{'name': 'china'}
rank
{'updated': 'yes'}
2
year
{}
2018
也可以通过直接找节点的方式遍历:
import xml.etree.ElementTree as et
tree = et.parse('xml_lesson.xml')
root = tree.getroot() for node in root.iter('rank'): #通过root.iter()方法直接找节点的标签,无论是第几层的节点都可找到,有几个找几个
print(node.tag,node.attrib,node.text)
结果:rank {'updated': 'yes'} 2
修改节点的操作:
import xml.etree.ElementTree as et
tree = et.parse('xml_lesson.xml')
root = tree.getroot() for node in root.iter('year'):
new_year = int(node.text) + 1 #node.text为字符串,需要转为int
node.text = str(new_year) #修改year节点的内容,需要转为str
node.set('update','no') #修改year节点属性,用set()方法
tree.write('xml_lesson.xml') #最后需要写入,这里其实是新建一个文件,如果文件名和之前相同,那就是覆盖
结果:xml_lesson.xml变为:
<data>
<country name="china">
<rank updated="yes">2</rank>
<year update="no">2019</year>
</country>
</data>
删除节点的操作:
xml_lesson.xml为:
<data>
<country name="china">
<rank updated="yes">2</rank>
<year update="no">2019</year>
</country>
<country name="India">
<rank updated="yes">47</rank>
<year update="no">2019</year>
</country>
</data>
需求:把排名高于10的国家删除
import xml.etree.ElementTree as et
tree = et.parse('xml_lesson.xml')
root = tree.getroot() for country in root.findall('country'): #findall()找到所有country节点
rank = int(country.find('rank').text) #在每一个country节点下面,find()找到rank节点
if rank > 10:
root.remove(country) #root.remove()删除country节点,注意不是删除rank节点
tree.write('abc.xml')
另一种写法:
for country in root.iter('country'):
for rank in country.iter('rank'):
# rank = int(country.find('rank').text)
if int(rank.text) > 10:
root.remove(country)
tree.write('222.xml')
最后,创建xml文档:
import xml.etree.ElementTree as ET new_xml = ET.Element("namelist") #生成根节点,tag为namelist
name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"}) #生成一级子节点,第一个参数是上一级节点,tag为name,有一个属性
age = ET.SubElement(name, "age", attrib={"checked": "no"}) #生产二级子节点,第一个参数是上一级节点,tag是age,有一个属性
sex = ET.SubElement(name, "sex")
sex.text = '33' #二级子节点的内容为'33'
name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")
age.text = '19' et = ET.ElementTree(new_xml) # 生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True) #写入
结果生成的test.xml文件:
<?xml version='1.0' encoding='utf-8'?>
<namelist>
<name enrolled="yes">
<age checked="no" />
<sex>33</sex>
</name>
<name enrolled="no">
<age>19</age>
</name>
</namelist>
(十五)xml模块的更多相关文章
- python学习第四十九天XML模块的用法
xml是实现不通语言或程序之间进行数据交换的协议,跟json差不多,但是json用起来简单,还没诞生json,以前都是用xml,下面讲述XML模块的用法. 1,导入xml模块 import xml 2 ...
- day15 十五、模块、from导入、起别名
一.模块的概念 1.什么是模块:一系列功能的集合体 2.定义模块:创建一个py文件就是一个模块,该py文件名就是模块名 模块的四种存在方式 使用python编写的.py文件 包:一堆py文件的集合体 ...
- Python学习日记(十五) collections模块
在内置函数(dict.list.set.tuple)的基础上,collections模块还提供了几个其他的数据类型:Counter.deque.defaultdict.namedtuple和Order ...
- 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容
孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...
- Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab ...
- day20 二十、加密模块、操作配置文件、操作shell命令、xml模块
一.加密模块 1.hashlib模块:加密 ①有解密的加密方式 ②无解密的加密方式:碰撞检查 -- 1)不同数据加密后的结果一定不一致 -- 2)相同数据的加密结果一定是一致的 import hash ...
- 二十五. Python基础(25)--模块和包
二十五. Python基础(25)--模块和包 ● 知识框架 ● 模块的属性__name__ # my_module.py def fun1(): print("Hello& ...
- 第三百二十五节,web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签
第三百二十五节,web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签 标签选择器对象 HtmlXPathSelector()创建标签选择器对象,参数接收response回调的html对象需 ...
- 孤荷凌寒自学python第二十五天初识python的time模块
孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...
- 第十五章、线程之queue模块的各种队列
目录 第十五章.线程之queue模块的各种队列 一.Queue 二.LifoQueue堆栈 三.PriorityQueue优先级队列 第十五章.线程之queue模块的各种队列 一.Queue impo ...
随机推荐
- Pytest 系列(27)- allure 命令行参数
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 先看看 allure 命令的帮助文 ...
- SpringBoot瘦身部署(15.9 MB - 92.3 KB)
1. 简介 SpringBoot项目部署虽然简单,但是经常因为修改了少量代码而需要重新打包上传服务器重新部署,而公网服务器的网速受限,可能整个项目的代码文件仅仅只有1-2MB甚至更少,但是需要上传 ...
- 多任务-python实现-死锁,银行家算法(2.1.5)
@ 目录 1.死锁 2.避免死锁的方式-银行家算法 1.死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系 ...
- VSCode + PYQT5 搭建图形化界面
1,安装依赖 pip install -i https://mirrors.aliyun.com/pypi/simple/ PyQt5 pip install -i https://mirrors.a ...
- Python手把手教程之用户输入input函数
函数input() 函数 input() 让程序暂停运行,等待用户输入一些文本.获取用户输入后,Python将其存储在一个变量中,以方便你使用. 例如,下面的程序让用户输入一些文本,再将这些文本呈现给 ...
- 在matlab 画箭头
[转载]在matlab 画箭头 原文地址:在matlab 画箭头作者:纯情小郎君 完整见链接http://www.mathworks.com/matlabcentral/fx_files/14056/ ...
- EF Core扩展工具记录 批量操作 记录修改删除历史 动态linq
Microsoft.EntityFrameworkCore.UnitOfWork Microsoft.EntityFrameworkCore的插件,用于支持存储库,工作单元模式以及支持分布式事务 ...
- ribbon源码分析
对于ribbon的使用我们只需要在RestTemplate的申明上面加上 @LoadBalanced 注解之后那么这个RestTemplate就具有了负载均衡的功能 ribbon是怎么实现这一功能的? ...
- RocketMQ(九):主从同步的实现
分布式系统的三大理论CAP就不说了,但是作为分布式消息系统的rocketmq, 主从功能是最最基础的了.也许该功能现在已经不是很常用了,但是对于我们理解一些分布式系统的常用工作原理还是有些积极意义的. ...
- JPA 缓存
JPA有两种类型的缓存: EntityManager自身就是一种缓存.事务中从数据库获取的和写入到数据库的数据会被缓存(什么样的数据会被缓存,在后面有介绍).在一个程序中也许会有很多个不同的Entit ...