xml处理

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的格式如下,就是通过<>节点来区别数据结构的:

 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)
View Code

修改和删除

原文地址:https://www.cnblogs.com/menkeyi/p/7205236.html