XML 해석 - SAX
- 각각의 attribute에 대한 Handler를 작성해준다.
- Parser에서 handler를 등록해서, parsing을 시켜준다.
from xml.sax import make_parser, handler
import sys
class ProductHandler(handler.ContentHandler):
def __init__(self, productName):
self.productName = productName
self.productList = []
self.charActive = 0
self.searchActive = 0
def startElement(self, name, attrs):
if name == 'product':
if self.productName.lower() == attrs.get('name', '').lower():
self.searchActive = 1
else:
self.searchActive = 0
if not self.searchActive:
return
if name == 'vendor':
self.vendor = attrs.get('name', 'unknown')
elif name == 'price':
self.model = attrs.get('model', 'unknown')
self.priceStr = ''
self.charActive = 1
def endElement(self, name):
if self.searchActive and name == 'price':
self.productList.append( (self.vendor, self.model, int(self.priceStr) ) )
self.charActive = 0
def characters(self, content):
if self.charActive:
self.priceStr += content
def endDocument(self):
self.productList.sort(lambda a,b : cmp(a[2], b[2]))
for product in self.productList:
print '%-7s %6s %5s' % product
if __name__ == '__main__':
h = ProductHandler(sys.argv[1])
parser = make_parser()
parser.setContentHandler(h)
parser.parse('c:\python25\scripts\product.xml')