【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:
pythonプログラムの作成:sax_demo.py
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]