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)