模块讲解----XML模块
XML实现不同语言或者程序之间进行数据交换的协议
XML文件格式如下:
1、浏览器返回的字符串格式类型有:
a、HTML
b、Json
c、XML
2、XML格式如下:
1 <data> #表示跟节点的开头 2 <country name="CTO" TEL='13511122233' > 3 <zongjian name='zhangsan' age='19'> 4 <jingli name='wangwu' age='22'> 5 .....(其他属性) 6 </jingli> 7 </zongjian> 8 <zongjian name='lisi' age='19'>2023</zongjian> 9 </country> 10 <country name="CEO"> 11 <rank updated="yes">5</rank> 12 <year>2026</year> 13 <gdppc>59900</gdppc> 14 <neighbor direction="N" name="Malaysia" /> 15 </country> 16 <country name="COO"> 17 <rank updated="yes">69</rank> 18 <year>2026</year> 19 <gdppc>13600</gdppc> 20 <neighbor direction="W" name="Costa Rica" /> 21 <neighbor direction="E" name="Colombia" /> 22 </country> 23 </data> #表示根节点的结尾
3、要点:
1 XML的格式就相当于字典嵌套字典的形式; 2 每一个节点都是一个Element对象节点里面可以嵌套节点; 3 每一个字典都是一个dict的对象,跟字典里嵌套字典的方式一样; 4 在XML的操作方法中,使用element中的每一个节点。
python中处理XML的两种格式方法
1 1、字符串类型;(可以用作有层次逻辑的页面展示) 2 例如:列车时刻表 3 http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID= 4 5 2、文本文件类型:(程序的配置文件) 6 数据库的类型:(mysql、oracle) 7 连接数据库IP: 8 端口: 9 连接池最多为多少:
解析XML
XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:
1 1、字符串解析: 2 (利用ElementTree.XML将字符串解析成xml对象) 3 from xml.etree import ElementTree as ET 4 5 # 打开文件,读取XML内容 6 str_xml = open('xo.xml', 'r').read() #这种方法也可以利用在requests请求后,返回来的xml结果集 7 8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 9 root = ET.XML(str_xml) 10 注:保存方法分2步(a、使ElementTree方法将内存的root保存一个变量里;b、然后在将变量写入到一个新的文件里) 11 12 13 14 2、文本文件直接解析: 15 (利用ElementTree.parse将文件直接解析成xml对象) 16 from xml.etree import ElementTree as ET 17 18 # 直接解析xml文件 19 tree = ET.parse("xo.xml") 20 21 # 获取xml文件的根节点 22 root = tree.getroot() 23 注:用解析XML文件的变量,直接写入到新文件中。 24 25 由于每个节点 都具有以上的方法,并且在上一步骤中解析时均得到了root(xml文件的根节点),所以可以利用以上方法进行操作xml文件。
操作XML
(一)、遍币:
1、遍币XML文档的所有内容:
1 from xml.etree import ElementTree as ET 2 3 ############ 解析方式一 ############ 4 """ 5 #字符串的方式解析 6 # 打开文件,读取XML内容 7 str_xml = open('xo.xml', 'r').read() 8 9 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 10 root = ET.XML(str_xml) 11 """ 12 ############ 解析方式二 ############ 13 #以文本文档格式解析 14 # 直接解析xml文件 15 tree = ET.parse("xo.xml") 16 17 # 获取xml文件的根节点 18 root = tree.getroot() 19 20 21 ### 操作 22 23 # 顶层标签 24 print(root.tag) 25 26 27 # 遍历XML文档的第二层 28 for child in root: 29 # 第二层节点的标签名称和标签属性 30 print(child.tag, child.attrib) 31 # 遍历XML文档的第三层 32 for i in child: 33 # 第二层节点的标签名称和内容 34 print(i.tag,i.text)
2、遍历XML中指定的节点:
1 from xml.etree import ElementTree as ET 2 3 ############ 解析方式一 ############ 4 """ 5 #字符串的方式解析 6 # 打开文件,读取XML内容 7 str_xml = open('xo.xml', 'r').read() 8 9 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 10 root = ET.XML(str_xml) 11 """ 12 13 14 ############ 解析方式二 ############ 15 # 遍历XML文档的第二层 16 # 直接解析xml文件 17 tree = ET.parse("xo.xml") 18 19 # 获取xml文件的根节点 20 root = tree.getroot() 21 22 23 ### 操作 24 25 # 顶层标签 26 print(root.tag) 27 28 29 # 遍历XML中所有的year节点 30 for node in root.iter('year'): 31 # 节点的标签名称和内容 32 print(node.tag, node.text)
(二)、修改并保存:
由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。
1、字符串格式:
1 #导入文件模块: 2 from xml.etree import ElementTree as ET 3 4 str_xml = open('ox.xml','r').read() #打开文件,读取XML内容 5 root = ET.XML(str_xml) #将字符串解析成xml特殊对象,root代指xml文件的跟节点 6 7 8 # 打印顶层的根标签 9 print(root.tag) 10 11 12 ######################增,删,改,查######################### 13 14 #循环所有的year标签:() 15 for node in root.iter('year'): 16 17 #修改标签的中间数据 18 new_year = int(node.text) + 1 19 node.text = str(new_year) 20 21 #设置标签属性: 22 node.set('name','zhangsan') 23 node.set('age','lisi') 24 25 #删除标签属性: 26 del node.attrib['name'] 27 28 #查看标签名称、属性、标签内容 29 print(node.tag,node.attrib) 30 print(node.text) 31 32 33 #######################保存######################## 34 35 #使ElementTree方法将内存的root保存一个变量里: 36 tree = ET.ElementTree(root) 37 38 #将XML的变量写入新的文件中: 39 tree.write('newox.xml',encoding='utf-8')
2、文本文档格式:
1 from xml.etree import ElementTree as ET 2 3 tree = ET.parse("ox.xml") #直接解析XML文件 4 root = tree.getroot() #获取xml文件的根节点 5 6 7 #打印顶层的根标签 8 print(root) 9 10 ######################增,删,改,查######################### 11 12 #循环所有year标签: 13 for node in root.iter('year'): 14 15 #修改year标签中的数据(将year节点中的内容自增一) 16 new_year = int(node.text) + 1 17 node.text = str(new_year) 18 19 #添加标签属性 20 node.set('name','zhangsan') 21 node.set('age','19') 22 23 #删除标签属性 24 del node.attrib['age'] 25 26 #查看标签名称、属性、标签内容 27 print(node.tag,node.attrib) 28 print(node.text) 29 30 #修改标签属性 31 node.set('name','lisi') 32 33 #查看标签名称、属性、标签内容 34 print(node.tag,node.attrib) 35 print(node.text) 36 37 #直接将内存中的root写入到新文件中 38 tree.write("new.xml",encoding='utf-8')
(三)、删除并保存:
1、解析字符串方式打开,删除,保存:
1 from xml.etree import ElementTree as ET 2 3 ############ 解析字符串方式打开 ############ 4 5 # 打开文件,读取XML内容 6 str_xml = open('xo.xml', 'r').read() 7 8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 9 root = ET.XML(str_xml) 10 11 ############ 操作 ############ 12 13 # 顶层标签 14 print(root.tag) 15 16 # 遍历data下的所有country节点 17 for country in root.findall('country'): 18 # 获取每一个country节点下rank节点的内容 19 rank = int(country.find('rank').text) 20 21 if rank > 50: 22 # 删除指定country节点 23 root.remove(country) 24 25 ############ 保存文件 ############ 26 tree = ET.ElementTree(root) 27 tree.write("newnew.xml", encoding='utf-8')
2、解析文件方式打开,删除,保存:
1 from xml.etree import ElementTree as ET 2 3 ############ 解析文件方式 ############ 4 5 # 直接解析xml文件 6 tree = ET.parse("xo.xml") 7 8 # 获取xml文件的根节点 9 root = tree.getroot() 10 11 ############ 操作 ############ 12 13 # 顶层标签 14 print(root.tag) 15 16 # 遍历data下的所有country节点 17 for country in root.findall('country'): 18 # 获取每一个country节点下rank节点的内容 19 rank = int(country.find('rank').text) 20 21 if rank > 50: 22 # 删除指定country节点 23 root.remove(country) 24 25 ############ 保存文件 ############ 26 tree.write("newnew.xml", encoding='utf-8')
创建XML文档方法
1、基于Element的创建:
变量名 = ET.Element('标签名',{'k1':'v1','k2':'v2'})
1 from xml.etree import ElementTree as ET 2 3 ##################################创建标签和标签属性############################## 4 #添加标签名字: 变量名 = ET.Element('标签名',{'k1':'v1','k2':'v2'}) 5 #创建跟节点标签和属性: 6 root = ET.Element('father',{'name':'Baba','age':'50'}) 7 8 #创建儿子节点标签和属性: 9 son1 = ET.Element('son_1',{'name':'zhangsan','age':'29'}) 10 son2 = ET.Element('son_2',{'name':'zhangsi','age':'26'}) 11 12 #创建孙子节点标签和属性: 13 grandchild1 = ET.Element('sunzi_1',{'name':'zhangwu','age':'2'}) 14 grandchild2 = ET.Element('sunzi_2',{'name':'zhangliu','age':'3'}) 15 16 #给孙子标签内添加内容: 17 grandchild1.text = '孙子1' 18 grandchild2.text = '孙子2' 19 20 21 ##################################指定标签到父子节点中################################ 22 #把孙子节点添加到儿子节点里: 23 son1.append(grandchild1) 24 son2.append(grandchild2) 25 26 27 #把儿子添加到父亲(跟)节点里: 28 root.append(son1) 29 root.append(son2) 30 31 32 ##################################保存文件################################ 33 #保存并写入文件: 34 tree = ET.ElementTree(root) 35 tree.write('oooo.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False) 36 37 38 39 40 显示结果: 41 <?xml version='1.0' encoding='utf-8'?> 42 <father age="58" name="wang1"> 43 <son1 age="27" name="wang2">儿子1</son1> 44 <son2 age="26" name="wang3">儿子2 45 <sunzi age="19" name="wang5">孙子2</sunzi> 46 </son2> 47 </father>
2、基于makeelement创建:
变量名 = 要添加上一级标签名字.makeelement('标签名',{'k1':'v1','k2':'v2'})
1 from xml.etree import ElementTree as ET 2 3 #创建跟节点标签 4 root = ET.Element('father',{'name':'zhangda','age':'58'}) 5 6 7 ##################################创建标签和标签属性############################## 8 #创建标签格式:变量名 = 要添加上一级标签名字.makeelement('标签名',{'k1':'v1','k2':'v2'}) 9 10 #创建儿子节点标签和属性: 11 #son1 = ET.Element('son1',{'name':'zhangsan','age':'28'}) 12 son1 = root.makeelement('son1',{'name':'lisi','age':'30'}) 13 #son2 = ET.Element('son2',{'name':'liwu','age':'29'}) 14 son2 = root.makeelement('son2',{'name':'lisan','age':'31'}) 15 16 #创建孙子节点标签和属性: 17 #granchild1 = ET.Element('granchild1',{'name':'liwu','age':'13'}) 18 granchild_1 = son1.makeelement('granchild_1',{'name':'li5','age':'14'}) 19 20 #granchild2 = ET.Element('granchild2',{'name':'liliu','age':'12'}) 21 granchild_2 = son2.makeelement('granchild_2',{'name':'li6','age':'12'}) 22 23 24 ##################################指定标签到父子节点中################################ 25 #将孙子节点添加到儿子节点: 26 son1.append(granchild_1) 27 son2.append(granchild_2) 28 29 #将儿子节点添加到父亲节点里: 30 root.append(son1) 31 root.append(son2) 32 33 34 ##################################保存文件################################ 35 tree = ET.ElementTree(root) 36 tree.write('oooo.xml',encoding='utf-8',short_empty_elements=False) 37 38 39 40 显示结果: 41 42 <father age="58" name="zhangda"> 43 <son1 age="30" name="lisi"> 44 <granchild_1 age="14" name="li5"> </granchild_1> 45 </son1> 46 47 <son2 age="31" name="lisan"> 48 <granchild_2 age="12" name="li6"> </granchild_2> 49 </son2> 50 </father>
3、基于SubElement的方式创建:
变量名 = ET.SubElement(上一级标签名,'当前标签名',attrib={'k1':'v1','k2':'v2'})
1 from xml.etree import ElementTree as ET 2 3 #创建根节点: 4 root = ET.Element("father",{'name':'wang1','age':'58'}) 5 6 #创建儿子节点和属性 7 #创建格式:变量名 = ET.SubElement(上一级标签名,'当前标签名',attrib={'k1':'v1','k2':'v2'}) 8 son1 = ET.SubElement(root,"son1",attrib={'name':'wang2','age':'27'}) 9 son1.text = '儿子1' 10 son2 = ET.SubElement(root,"son2",attrib={'name':'wang3','age':'26'}) 11 son2.text = '儿子2' 12 13 #创建孙子节点 14 15 #grandchild_1 = ET.SubElement(son1,"sunzi",attrib={'name':'wang4','age':'18'}) 16 #grandchild_1.text = '孙子1' 17 grandchild_2 = ET.SubElement(son2,"sunzi",attrib={'name':'wang5','age':'19'}) 18 grandchild_2.text = '孙子2' 19 20 #保存 21 free = ET.ElementTree(root) 22 free.write('test.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False) 23 24 25 26 显示结果: 27 <?xml version='1.0' encoding='utf-8'?> 28 <father age="58" name="wang1"> 29 <son1 age="27" name="wang2">儿子1</son1> 30 <son2 age="26" name="wang3">儿子2 31 <sunzi age="19" name="wang5">孙子2</sunzi> 32 </son2> 33 </father>
XML的格式化
1 1、格式化xml函数: 2 def prettify(elem): 3 ''' 4 将节点转换成字符串,并添加缩进 5 ''' 6 rough_string = ET.tostring(elem, 'utf-8') 7 reparsed = minidom.parseString(rough_string) 8 return reparsed.toprettyxml(indent="\t") 9 10 2、调用格式化函数,并将root传参: 11 raw_str = prettify(root) 12 13 3、将格式化好的变量写入文本文档: 14 with open('oooo.xml','w',encoding='utf-8') as f: 15 f.write(raw_str)
案例:
1 #!/usr/bin/env python 2 # -*- coding:utf8 -*- 3 # Author:Dong Ye 4 5 from xml.etree import ElementTree as ET 6 from xml.dom import minidom 7 8 9 #格式化xml函数: 10 def prettify(elem): 11 ''' 12 将节点转换成字符串,并添加缩进 13 ''' 14 rough_string = ET.tostring(elem, 'utf-8') 15 reparsed = minidom.parseString(rough_string) 16 return reparsed.toprettyxml(indent="\t") 17 18 19 ##################################创建标签和标签属性############################## 20 #添加标签名字: 变量名 = ET.Element('标签名',{'k1':'v1','k2':'v2'}) 21 #创建跟节点标签和属性: 22 root = ET.Element('father',{'name':'Baba','age':'50'}) 23 24 #创建儿子节点标签和属性: 25 son1 = ET.Element('son_1',{'name':'zhangsan','age':'29'}) 26 son2 = ET.Element('son_2',{'name':'zhangsi','age':'26'}) 27 28 #创建孙子节点标签和属性: 29 grandchild1 = ET.Element('sunzi_1',{'name':'zhangwu','age':'2'}) 30 grandchild2 = ET.Element('sunzi_2',{'name':'zhangliu','age':'3'}) 31 32 #给孙子标签内添加内容: 33 grandchild1.text = '儿子1--孙子1' 34 grandchild2.text = '儿子2--孙子2' 35 36 37 ##################################指定标签到父子节点中################################ 38 #把孙子节点添加到儿子节点里: 39 son1.append(grandchild1) 40 son2.append(grandchild2) 41 42 43 #把儿子添加到父亲(跟)节点里: 44 root.append(son1) 45 root.append(son2) 46 47 ##################################保存文件################################ 48 #保存并写入文件: 49 # tree = ET.ElementTree(root) 50 # tree.write('oooo.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=False) 51 52 53 raw_str = prettify(root) 54 55 with open('oooo.xml','w',encoding='utf-8') as f: 56 f.write(raw_str)
”