XML是实现不同语言或程序之间进行数据交换的协议;
通常浏览器返回的字符串有三种格式:
1、HTML
2、Json
3、XML
其中,XML可以在页面上做展示,可以作为程序的配置文件(获取字符串类型的XML格式数据)
xml的特点:以<>开始和结尾,包含根节点、子节点;
每一个节点都是element对象,节点下可以嵌套节点,element对象下可以获得各个方法。比如:tag(节点名称)、attib(属性)、text(内容)、makeelement(创建一个新节点)、append(追加一个子节点)等
如下所示的xml文件:
案例1:找根节点:
from xml.etree import ElementTree as ET
tree=ET.parse('hh.xml')
root=tree.getroot()#获取xml的根节点
print('根节点',root) #但因根节点,类型均为element;
print('根节点的名称',root.tag)#获取根节点名字,
print('根节点的属性',root.attrib)#获取根节点名字,
效果:
案例2:找二级、三级等节点
from xml.etree import ElementTree as ET
tree=ET.parse('hh.xml')
root=tree.getroot()#获取xml的根节点
for i in root:
print('二级节点名称',i.tag,'二级节点属性',i.attrib)
for gradechild in i:
print('3级节点名称:',gradechild.tag,'3级节点内容:',gradechild.text)
效果:
解析XML的两种方式:
1、解释字符串,无ElementTree,自己打开文件拿到,或者发送request模块拿到返回值
将字符串解析为xml
from xml.etree import ElementTree as ET
# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read()
# 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)
2、解析文件,会有用ElementTree,两个步骤拿到Element,将文件解析为xml;ElementTree可以写入东西
from xml.etree import ElementTree as ET
# 直接解析xml文件
tree = ET.parse("xo.xml")
# 获取xml文件的根节点
root = tree.getroot()
案例3:修改xml,用字符方式读取的;
#以字符串导入
from xml.etree import ElementTree as ET
str_xml=open('hh.xml','r').read()
root=ET.XML(str_xml)
print(root.tag)#拿到所以的根节点
#循环所有的year节点
for i in root.iter('year'):
#将year内容自增1
new_year=int(i.text)+1
i.text=str(new_year)
#设置属性
i.set('name',"hx")
i.set('age','18')
#删除属性
# del i.attrib['name']
#操作完了,需要保存,要用到ElementTree
tree=ET.ElementTree(root)
tree.write('hhnew',encoding='utf-8')#如果用文件方式解析,则可以直接用此句
执行结果:新增一个文件hhnew,内容如下:已修改所有内容
案例4:在Element基础上新增一个节点,可以写上内容
#在element的基础上新增一个节点,并写入内容
from xml.etree import ElementTree as ET
tree=ET.parse('hh.xml')
root=tree.getroot()
ele=ET.Element("hh",{'k1':'b1'})#创建element对象
ele.text="写入新的内容"
root.append(ele)#append
tree.write('hh_new2',encoding='utf-8')#写入新的文件
执行结果:会新增如下一句话
案例5:创建一个XML
#创建一个新的xml
from xml.etree import ElementTree as ET
from xml.dom import minidom
def prettify(ele):#将所有的节点转换成字符串,并添加缩进
rough_string=ET.tostring(ele,'utf-8')
str=minidom.parseString(rough_string)
return str.toprettyxml(indent="\t")#添加缩进
#创建根节点
root=ET.Element('famliy')
#创建节点的大儿子
son1=ET.Element('son',{'name':'儿子1'})
#创建节点的小儿子
son2=ET.Element('son',{'name':'儿子2'})
#在大儿子下创建两个孙子
grandson1=ET.Element('grandson',{'name':'儿子1孙子1'})
grandson1.text='孙子1的节点内容'
grandson2=ET.Element('grandson',{'name':'儿子1孙子2'})
grandson2.text='孙子2的节点内容'
#把孙节点更新到儿节点
son1.append(grandson1)
son1.append(grandson2)
#把儿节点更新到根节点
root.append(son1)
root.append(son2)
raw_str=prettify(root)#缩进
#用打开文件方式写入
f=open('hhnew3','w',encoding='utf-8')
f.write(raw_str)
f.close()
执行结果: