小白的Python之路 day5 模块XML特点和用法
模块XML的特点和用法
一、简介
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。
二、特点
xml的格式如下,就是通过<>节点来区别数据结构的:
1 <duoduo>#这里面的内容可以换 2 <country name="Liechtenstein"> 3 <rank updated="yes">2</rank> 4 <year>2008</year> 5 <gdppc>141100</gdppc> 6 <neighbor name="Austria" direction="E"/> 7 <neighbor name="Switzerland" direction="W"/> 8 </country> #观察可以发现实际上和字典的特性差不多 9 <country name="Singapore"> 10 <rank updated="yes">5</rank> 11 <year>2011</year> 12 <gdppc>59900</gdppc> 13 <neighbor name="Malaysia" direction="N"/> 14 </country> 15 <country name="Panama"> 16 <rank updated="yes">69</rank> 17 <year>2011</year> 18 <gdppc>13600</gdppc> 19 <neighbor name="Costa Rica" direction="W"/> 20 <neighbor name="Colombia" direction="E"/> 21 </country> 22 </duoduo>
三、XML的用法
xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml
1、查询xml文档内容
1 import xml.etree.ElementTree as ET 2 3 tree = ET.parse("xmltest.xml") 4 root = tree.getroot() 5 print(root) #获取根节点,也就是内存地址 6 print(root.tag) #根的名字 7 8 # 遍历xml文档 9 for country in root: 10 print(country.tag, country.attrib) #分别打印子节点名称和子节点属性 11 for i in country: #遍历子节点下的所有节点 12 print(i.tag, i.text,i.attrib) #打印子节点下节点的节点名,节点值,节点值的属性 13 # 只遍历year节点 14 for i in country.iter("year"): 15 print("\t", i.tag, i.attrib, i.text) 16 17 # 只遍历year 节点 18 for node in root.iter('year'): 19 print(node.tag, node.text) #打印year的节点名和节点值
重点:
1、tag是返回节点名,attrib返回节点属性,text返回节点值
2、返回根节点用getroot()方法
3、只遍历某个节点,只需要用iter(节点名)方法
4、遍历找不到要找的只能继续往下遍历
2、修改xml文档内容
1 import xml.etree.ElementTree as et 2 3 tree = et.parse("xmltest.xml") 4 root = tree.getroot() 5 6 #修改year节点的值 7 for node in root.iter("year"): 8 new_year = int(node.text) + 1 #修改节点值 9 node.text = str(new_year) #修改后强制转换成字符串类型 10 node.tag = "newyear" #修改节点名 11 node.set("duoduo",'2018') #修改节点属性 12 13 tree.write("xmltest1.xml") #修改完成后,重新写入xml文件(可以是任何文件,包括原来的)
重点:
可以修改xml文件中的任何内容,包括本身的节点名,修改后一定要有写入xml文件的操作。
3、删除xml文档内容
1 import xml.etree.ElementTree as et 2 3 tree = et.parse("xmltest.xml") 4 root = tree.getroot() 5 6 #删除 7 for country in root.findall("country"): #找到第一层子节点(“具体对象”) 8 rank = int(country.find("rank").text) #找到子节点下的(“rank”)节点的节点值 9 if rank > 50: 10 root.remove(country) #删除子节点 11 12 tree.write("xmltest1.xml") #重新写入xml文件
重点:
1、root.findall()从根节点只能根据第一层的子节点名查找,并且返回第一层子节点的内存地址,前面root定义什么区域,就查找什么区域
2、删除子节点用remove()方法
3、删除以后,一定要做重新写入新的xml文件操作
4、创建新的xml文件
1 import xml.etree.ElementTree as et 2 3 new_xml = et.Element("namelist") #创建根节点 4 5 #创建第一层子节点,后面参数依次是:父节点,子节点,子节点属性 6 name = et.SubElement(new_xml,"name",attrib={"duoduo":"handsome"}) 7 #创建第二层子节点 8 age = et.SubElement(name,"age",attrib={"check":"yes"}) 9 #设置第二层节点值 10 age.text = '22' 11 sex = et.SubElement(name,"sex") 12 sex.text = "man" 13 #创建另外一个第一层子节点 14 name2 = et.SubElement(new_xml,"name",attrib={"qianduoduo":"haoshuai"}) 15 #创建其第二层子节点 16 age = et.SubElement(name2,"age") 17 age.text = '19' 18 19 ET = et.ElementTree(new_xml) #生成新的xml文档 20 ET.write("test.xml",encoding="utf-8",xml_declaration=True) #在新xml文件的开头自动添加:<?xml version='1.0' encoding='utf-8'?> 21 22 et.dump(new_xml) #在屏幕上打印生成的格式
重点:pycharm创建的xml直接就是一行,没有格式.