at_yasu's blog

ロード的なことを

PythonでSaxを使う

SecondLifeで現在、webから換金情報をXMLでダウンロードできるようになっています。ので、pythonでさくさくっとパースするクラスを作りました。

pythonは2.5で動作確認。2.4だと動くかどうか不明。

#!/usr/bin/python
#
# written by a.yasui <a.yasui@gmail.com>
#
# ex, ISBN:9784873112763 -- Python Cookbook 12.7

import sys
import re
from xml.sax import saxutils, parse
import xml.sax.handler

TRANSACTION_MATCH = re.compile(r'^(:?transaction_)\d+$', re.I)

class SLTransactionHandler(xml.sax.handler.ContentHandler):
	def __init__ (self):
		self._charas = [ ]
		
		self._root = [ ]         # Root node
		self._transaction = [ ]  # transaction Node
		self._dict = dict()      # inner node
	
		self.hash_ref = [ ]      # output
	
	def characters(self, content):
		self._charas.append(content)
	
	def startElement (self, name, attrs):
		if name == "transactions" :
			pass
		elif TRANSACTION_MATCH.match(name) :
			self._transaction = [ ]
		else :
			self._charas = [ ]
	
	def endElement (self, name):
		if name == "transactions" :
			pass
		elif TRANSACTION_MATCH.match(name) :
			self.hash_ref.append(self._dict)
		else :
			self._dict[name] = "".join(self._charas)

if __name__ == '__main__':
	handler = SLTransactionHandler()
	parse(sys.argv[1], handler)
	print handler.hash_ref