2012年10月25日木曜日

python - SAX を使った xml のパース

パースされている最中に呼ばれる関数を実装する。
自前で状態を保存しなければならないので、入れ子が多いなど複雑なファイルのパースには向きそうにない。

import xml.sax, xml.sax.handler, pprint

class BookHandler(xml.sax.handler.ContentHandler):
    
    def __init__(self):
        self.inTitle = False
        self.mapping = {}
    
    def startElement(self, name, attributes):
        if name == 'book':
            self.buffer = ""
            self.isbn = attributes["isbn"]
        elif name == "title":
            self.inTitle = True
    
    def characters(self, data):
        if self.inTitle:
            self.buffer += data
    
    def endElement(self, name):
        if name == "title":
            self.inTitle = False
            self.mapping[self.isbn] = self.buffer

parser = xml.sax.make_parser()
handler = BookHandler()
parser.setContentHandler(handler)
parser.parse('books.xml')
pprint.pprint(handler.mapping)
print handler.mapping

0 件のコメント:

コメントを投稿