本文实例讲述了Python存取XML的常见方法。分享给大家供大家参考,具体如下:
目前而言,Python 3.2存取XML有以下四种方法:
1.Expat
2.DOM
3.SAX
4.ElementTree
以以下xml作为讨论依据
<?xml version="1.0" encoding="utf-8"?><Schools> <School Name="XiDian"> <Class Id="030612"> <Student Name="salomon"> <Scores> <Math>98</Math> <English>85</English> <physics>89</physics> </Scores> </Student> <Student Name="Jupiter"> <Scores> <Math>74</Math> <English>83</English> <physics>69</physics> </Scores> </Student> </Class> <Class Id="030611"> <Student Name="Venus"> <Scores> <Math>98</Math> <English>85</English> <physics>89</physics> </Scores> </Student> <Student Name="Mars"> <Scores> <Math>74</Math> <English>83</English> <physics>69</physics> </Scores> </Student> </Class> </School></Schools>
Expat
Expat是一个面向流的解析器。您注册的解析器回调(或handler)功能,然后开始搜索它的文档。当解析器识别该文件的指定的位置,它会调用该部分相应的处理程序(如果您已经注册的一个)。该文件被输送到解析器,会被分割成多个片断,并分段装到内存中。因此expat可以解析那些巨大的文件。
SAX
SAX是个循序存取XML的解析器API,一个实现SAX的解析器(也就是“SAX Parser”)以一个串流解析器的型式作用,拥有事件驱动API。由使用者定义回调函数,解析时,若发生事件的话会被调用。事件在任一XML特性遇到时引发,以及遇到他们结尾时再次引发。XML属性也作为传给元素事件资料的一部分。SAX 处理时单方向性的;解析过的资料无法在不重新开始的情况下再次读取。
DOM
DOM解析器在任何处理开始之前,必须把整棵树放在内存,所以DOM解析器的内存使用量完全根据输入资料的大小(相对来说,SAX解析器的内存内容,是只基于XML档案的最大深度(XML树的最大深度)和单一XML项目上XML属性储存的最大资料)。
DOM在python3.2中有两种实现方式:
1.xml.minidom是一个基本的实现。
2.xml.pulldom只在需要时构建被访问的子树。
'''Created on 2012-5-25@author: salomon'''import xml.dom.minidom as minidomdom = minidom.parse("E://test.xml")root = dom.getElementsByTagName("Schools") #The function getElementsByTagName returns NodeList.print(root.length)for node in root: print("Root element is %s。" %node.tagName)# 格式化输出,与C系列语言有很大区别。 schools = node.getElementsByTagName("School") for school in schools: print(school.nodeName) print(school.tagName) print(school.getAttribute("Name")) print(school.attributes["Name"].value) classes = school.getElementsByTagName("Class") print("There are %d classes in school %s" %(classes.length, school.getAttribute("Name"))) for mclass in classes: print(mclass.getAttribute("Id")) for student in mclass.getElementsByTagName("Student"): print(student.attributes["Name"].value) print(student.getElementsByTagName("English")[0].nodeValue) #这个为什么啊? print(student.getElementsByTagName("English")[0].childNodes[0].nodeValue) student.getElementsByTagName("English")[0].childNodes[0].nodeValue = 75f = open('new.xml', 'w', encoding = 'utf-8')dom.writexml(f,encoding = 'utf-8')f.close()
新闻热点
疑难解答