python之XML文件解析
python对XML的解析
常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。
python有三种方法解析XML,分别是SAX,DOM,以及ElementTree三种方法。
以下案例依次介绍三种方法:
先写一个关于book的xml文件
<books> <book id="01"> <bookname>python入门</bookname> <author>李强</author> <price>25</price> </book> <book id="02"> <bookname>java基础</bookname> <author>王洋</author> <price>30</price> </book> <book id="03"> <bookname>神雕侠侣</bookname> <author>金庸</author> <price>212</price> </book> </books>
1.DOM(Document Object Model)
将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
操作代码如下:
#引入parse的包 from xml.dom.minidom import parse doc=parse("book.xml") #先把xml文件加载进来 root=doc.documentElement #获取元素的根节点 books=root.getElementsByTagName('book') #找到子节点,得到的是一个数组 for book in books: #把所有的子节点进行遍历 print("===book====") if book.hasAttribute('id'): #如果有ID属性,则输出 print('书的ID是:%s'% book.getAttribute('id')) bookname=book.getElementsByTagName("bookname")[0] #根据标签名找到,并且输出第一个元素 print("书名是:%s"%bookname.childNodes[0].data) #输出标签名的子节点的第一个值,并转为data类型 author=book.getElementsByTagName("author")[0] print("作者是:%s"%author.childNodes[0].data) price=book.getElementsByTagName("price")[0] print("价格是:%s"%price.childNodes[0].data)
2.SAX (simple API for XML )
python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
from xml.sax import parse, ContentHandler #引入继承包ContentHandler #书的类 class Book: #定义初始化属性,和xml文件属性相同 def __init__(self,bookname=None,author=None,price=None): self.bookname=bookname self.author=author self.price=price def __str__(self): #转化为字符串输出 return self.bookname+","+self.author+","+self.price books=[]#定义一个书的数组,用来存放每次得到的数据 #定义继承ContentHandler的类,可以实现相应的方法 class bkdemo(ContentHandler): def __init__(self): #定义全局变量 self.book=None #用来接收book的相应数据 self.tag=None #用来接收characters方法得到的content内容 def startDocument(self): #books对象开始 print("对象开始") def endDocument(self): #books对象结束 print("对象结束") def startElement(self, name, attrs): #每一个标签元素的开始,name:标签名称 attrs:标签内部相应属性 if name=='book': #如果标签名是book self.book=Book() #创建一个Book()对象 def endElement(self, name): #每一个标签元素的结束,name:标签名称 (此时才会得到相应的content) if name=='bookname': self.book.bookname=self.tag #对象的标签名=得到相应content的值 if name=='author': self.book.author=self.tag if name=='price': self.book.price=self.tag if name=='book': books.append(self.book) #为定义的数组追加得到的相应元素 def characters(self, content): self.tag=content #写了self的,就可以定义为全局变量 parse("book.xml",bkdemo()) #parse的方法,分别指明xml文件,并调用查找的类方法 for i in books: #对数组books[]循环 print(i)
3.ElementTree(元素树)
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
from xml.etree import ElementTree #引入ElementTree的包 #书的类 class Book: #定义初始化属性,和xml文件属性相同 def __init__(self,bookname=None,author=None,price=None): self.bookname=bookname self.author=author self.price=price def __str__(self): #转化为字符串输出 return self.bookname+","+self.author+","+self.price roota=ElementTree.parse("book.xml") #parse方法读取xml文件,得到元素树 bk=roota.findall("book") #findall查询所有的book标签 boo=[] #定义一个集合 for aa in bk: #对得到的所有的根元素下的子标签循环输出 book=Book() #定义一个类对象 book.bookname=aa.find("bookname").text #对象的相应标签值=子标签查找到的固定标签名,并以text形式输出 book.author=aa.find("author").text book.price=aa.find("price").text boo.append(book) #将得到的属性值追加到定义的集合中 for i in boo: #遍历集合 print(i)
输出结果:
python入门,李强,25 java基础,王洋,30 神雕侠侣,金庸,212 Process finished with exit code 0
注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。
本章节使用到的 XML 实例文件 movies.xml 内容如下: