Skip to content

Instantly share code, notes, and snippets.

@sgk
Created December 9, 2010 15:44
Show Gist options
  • Save sgk/734855 to your computer and use it in GitHub Desktop.
Save sgk/734855 to your computer and use it in GitHub Desktop.
Simple to use XML parser
import xml.sax.handler
import xml.sax
class Node(object):
def __init__(self, name=None, attrs=None):
self.name_ = name
self.attrs_ = attrs
self.dict_ = {}
self.str_ = ''
def add(self, name, attrs=None):
node = Node(name, attrs)
self.dict_[name] = self.dict_.get(name, []) + [node]
return node
def addstring(self, s):
self.str_ += s
def get(self, name):
try:
return self.dict_[name][0]
except KeyError, IndexError:
return None
def all(self, name):
return self.dict_.get(name, [])
def __str__(self):
return self.str_
def __unicode__(self):
return self.str_
def __getitem__(self, key):
return self.dict_[key][0]
def __len__(self):
return len(self.dict_)
def keys(self):
return self.dict_.keys()
def __getattr__(self, name):
try:
return self.dict_[name][0]
except (KeyError, IndexError):
return Node()
class Handler(xml.sax.handler.ContentHandler):
def __init__(self):
self.root_ = Node()
self.stack_ = [self.root_]
def startElement(self, name, attrs):
node = self.stack_[-1].add(name, attrs)
self.stack_.append(node)
def endElement(self, name):
self.stack_.pop()
def result(self):
return self.root_
def characters(self, content):
self.stack_[-1].addstring(content)
def parse(fname_or_stream):
h = Handler()
xml.sax.parse(fname_or_stream, h)
return h.result()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment