(十五)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 ...
随机推荐
- 零基础学习python 你该怎么做
本人文科生,回顾自己近 2 年的Python 自学经历,有一些学习心得和避坑经验分享给大家,让大家在学习 Python 的过程中少走一些弯路!减少遇到不必要的学习困难! 首先,最开始最大的困难应该就是 ...
- 如何用Python 制作词云-对1000首古诗做词云分析
公号:码农充电站pro 主页:https://codeshellme.github.io 今天来介绍一下如何使用 Python 制作词云. 词云又叫文字云,它可以统计文本中频率较高的词,并将这些词可视 ...
- easyUI验证框赋值
下面来看看easyui的各种验证框赋值的方式: <input name="userId" id="userId" class="easyui-n ...
- css进阶 01-CSS中的非布局样式
01-CSS中的非布局样式 #前言 CSS中,有很多非布局样式,这些样式(属性)和与布局无关,包括: 字体.字重.颜色.大小.行高 背景.边框 滚动.换行 装饰性属性(粗体.斜体.下划线)等. 这篇文 ...
- [日常摸鱼]Vijos1083小白逛公园-线段树
题意:单点修改,询问区间最大子段和,$n\leq 5e5$ 考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案, ...
- Javascript之Firefox与IE
IE其实相对来讲并不是规范的遵循者,错怪firefox了. 2020注:IE看来要退出市场了,这些也逐渐成为历史了.:) 1firefox不支持iframe.document, 而IE支持,所以对fi ...
- Spark-6-如何缓解消除数据倾斜
1 尽量避免数据源的数据倾斜 比如数据源是Kafka 以Spark Stream通过DirectStream方式读取Kafka数据为例.由于Kafka的每一个Partition对应Spark的一个Ta ...
- #2020征文-手机#深鸿会深大小组:HarmonyOS手机游戏—数字华容道
目录: 前言 概述 正文 创建项目 实现初始界面布局 实现数字的随机打乱 实现滑动或点击调换数字 实现游戏成功界面 结语 源码包 前言 12月16号HarmonyOS2.0手机开发者Beta版已经发布 ...
- 让你轻松掌握 Python 中的 Hook 钩子函数
1. 什么是Hook 经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是 ...
- 将Maven镜像更换为国内阿里云仓库
1.国内访问maven默认远程中央镜像特别慢 2.用阿里的镜像替代远程中央镜像 3.大部分jar包都可以在阿里镜像中找到,部分jar包在阿里镜像中没有,需要单独配置镜像 换为国内镜像,让你感受飞一般的 ...