【Python】XMLファイル解析のSAX(Simple API for XML)

2375 ワード

一般的なXMLプログラミングインタフェースにはDOMとSAXがあり、この2つのインタフェースはXMLファイルを処理する方法が異なり、もちろん使用場面も異なります.
DOMとSAXの違い
DOM(Document Object Model):XMLデータをメモリ内で1つのツリーに解析し、ツリーの操作でXMLを操作します.
SAX(Simple API for XML):イベント駆動モデルを使用して、XMLの解析中に個々のイベントをトリガーし、ユーザー定義のコールバック関数を呼び出すことでXMLファイルを処理します.
DOMはXMLデータをメモリにマッピングするツリーを必要とするため、1つは比較的遅い、2つは比較的メモリを消費するが、SAXストリームはXMLファイルを読み取り、比較的速く、メモリを消費するのは少ないが、ユーザーがコールバック関数(handler)を実現する必要がある.
SAXとDOMの使用の場合
Use DOM when:
• read-write access to the document is required
• the processing requires random access to the document
Use SAX when:
• dealing with big documents (>1MB)
• looking for a precise information in the document
• instantiating custom objects from the document
SAXプログラムの構成
readers:XMLファイルのリーダで、読み取りプロセスはhandlerプロセス処理に一連のイベントを送信します.
handlers:ユーザーがイベント処理関数をカスタマイズするイベントプロセッサ.
xmlfiles:処理するXMLファイル
Exceptions:SAXは4種類の異常処理クラスを提供している
単純な例
まずxmlファイルを作成します:students.xml:
<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student id="1">
        <name>zhangsan</name>
        <age>20</age>
        <dob>1990.11.22</dob>
    </student>
    <student id="2">
        <name>lisi</name>
        <age>21</age>
        <dob>1992.06.15</dob>
    </student>
</students>

pythonプログラムの作成:sax_demo.py
# -*- coding:utf-8 -*-
import sys
from xml.sax import parse, handler, SAXException

class MyGeneralHandler(handler.ContentHandler):
    """
              
    """
    #        
    def startDocument(self):
        print 'Document Start...'

    #        
    def endDocument(self):
        print 'Document End...'

    #        
    def startElement(self, name, attrs):
        print 'encounter element(%s)' % (name)

    #        
    def endElement(self, name):
        print 'leave element(%s)' % (name)

    #      
    def characters(self, content):
        if content.isspace():  #        
            return
        print 'characters:' + content


try:
    parse('students.xml', MyGeneralHandler())
except SAXException, msg:
    print msg.getException()
except:
    print sys.exc_info()[0],sys.exc_info()[1]