xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。
python有三种方法解析XML,SAX,DOM,以及ElementTree
###1.SAX (simple API for XML )
pyhton 标准库包含SAX解析器,SAX是一种典型的极为快速的工具,在解析XML时,不会占用大量内存。
但是这是基于回调机制的,因此在某些数据中,它会调用某些方法进行传递。这意味着必须为数据指定句柄,
以维持自己的状态,这是非常困难的。
修改、删除、增加
#修改数据 for node in root.iter('year'): new_year = int(node.text) + 1 node.text = str(new_year) node.set("updated","yes") tree2.write("test.xml") #删除数据 for country in root.findall('country'): rank = int(country.find('rank').text) if rank > 50: root.remove(country) tree2.write('output.xml')
###2.DOM(Document Object Model)
与SAX比较,DOM典型的缺点是比较慢,消耗更多的内存,因为DOM会将整个XML数读入内存中,并为树
中的第一个节点建立一个对象。使用DOM的好处是你不需要对状态进行追踪,因为每一个节点都知道谁是它的
父节点,谁是子节点。但是DOM用起来有些麻烦。
###3.ElementTree(元素树)
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少,这里主要
介绍ElementTree。
xml的格式如下,就是通过<>节点来区别数据结构的:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #-*- coding:utf-8 -*- 2 import xml.etree.ElementTree as ET 3 4 str_obj=""" 5 <?xml version="1.0" ?> 6 <data> 7 <country name="Liechtenstein"> 8 <rank updated="yes">2</rank> 9 <year>2008</year> 10 <gdppc>141100</gdppc> 11 <neighbor name="Austria" direction="E"/> 12 <neighbor name="Switzerland" direction="W"/> 13 </country> 14 <country name="Singapore"> 15 <rank updated="yes">5</rank> 16 <year>2011</year> 17 <gdppc>59900</gdppc> 18 <neighbor name="Malaysia" direction="N"/> 19 </country> 20 <country name="Panama"> 21 <rank updated="yes">69</rank> 22 <year>2011</year> 23 <gdppc>13600</gdppc> 24 <neighbor name="Costa Rica" direction="W"/> 25 <neighbor name="Colombia" direction="E"/> 26 </country> 27 </data> 28 """ 29 30 31 32 33 34 35 #将字符串处理成xml格式,这种方式不需要getroot() 36 tree = ET.fromstring(str_obj.strip()) 37 #直接读取xml文件 38 tree2 = ET.parse("test.xml") 39 40 #获取到根层 41 root = tree2.getroot() 42 print(root.tag) 43 44 #遍历xml文档,attrib:<country name="Panama">name就是ountry的属性 45 for child in root: 46 print(child.tag, child.attrib) 47 for i in child: 48 print(i.tag,i.text) 49 50 #只遍历year 节点 51 for node in root.iter('year'): 52 print(node.tag,node.text) 53 54 55 #循环字符转成的xml 56 for node in tree.iter('gdppc'): 57 print(node.tag,node.text)
修改和删除