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)