python有三种方法解析XML,SAX,DOM,以及ElementTree
1.SAX (simple API for XML )
python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
2.DOM(Document Object Model)
将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
3.SAX是一种基于时间驱动的api
利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。
解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;
而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。
<psax适于处理下面的问题:< p="" data-filtered="filtered" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", "WenQuanYi Micro Hei", Arial, sans-serif; font-size: 12px; text-align: start; background-color: rgb(255, 255, 255);">
1、对大型文件进行处理;
2、只需要文件的部分内容,或者只需从文件中得到特定信息。
3、想建立自己的对象模型的时候。
python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="01"> <name>python入门</name> <author>李强</author> <price>25</price> </book> <book id="02"> <name>Java基础</name> <author>王泽</author> <price>30</price> </book> <book id="03"> <name>神雕侠侣</name> <author>金庸</author> <price>25</price> </book> </books>
练习:
# from xml.dom.minidom import parse # import xml.dom.minidom #import xml.sax from xml.sax import parse from xml.sax import ContentHandler print("==============xml解析==============") ''' DOM解析: 将整个配置文件所有内容加载到内存中,形成一个dom树,依据树的结构来进行解析 ''' # print() # print("解析book.xml=======================") # DOMTree=xml.dom.minidom.parse("book.xml") # books=DOMTree.documentElement # #获得三个book节点 # book = books.getElementsByTagName("book") # # for book1 in book: # print ("\n================Book================") # name = book1.getElementsByTagName('name')[0] # print ("Bookname: %s" % name.childNodes[0].data) # # author = book1.getElementsByTagName('author')[0] # print ("BookAuthor: %s" % author.childNodes[0].data) # # price = book1.getElementsByTagName('price')[0] # print ("BookPrice: %s" % price.childNodes[0].data) ''' sax解析: SAX是一种基于事件驱动的API。 使用ContentHandle类 ====================================== ContentHandler类方法介绍: characters(content)方法 调用时机: 从行开始,遇到标签之前,存在字符,content的值为这些字符串。 从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串。 从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。 标签可以是开始标签,也可以是结束标签。 startDocument()方法 文档启动的时候调用。 endDocument()方法 解析器到达文档结尾时调用。 startElement(name, attrs)方法 遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。 endElement(name)方法 遇到XML结束标签时调用。 ''' # class books: # def __init__(self,name=None,author=None,price=None): # self.name=name # self.author = author # self.price=price # def __str__(self): # return self.name+''+self.author+''+str(self.price) # Book=[] # class SaxJieXi(ContentHandler): # def __init__(self): # self.books=None # self.tag=None # def startDocument(self): #开始加载文档 # pass # def endDocument(self): #解析器到达文档结尾时调用 # pass # def startElement(self, name, attrs): #遇到XML开始标签时调用, # if name=="book": # self.books=books() # def endElement(self, name): #遇到XML结束标签时调用 # if name=="name": # self.books.name=self.tag # if name == "author": # self.books.author=self.tag # if name == "price": # self.books.name = self.tag # if name=="book": # Book.append(self.books) # def characters(self, content): #开始和结束时都调用 # self.tag=content # parse("book.xml",SaxJieXi())#析xml文件,并且开始出发相对应的事件 # for i in Book: # print(i)