#!/usr/bin/env python # # Example of how to parse an XML document and then write it out again. # This snippet is public domain, use it as you wish. # import xml.etree.ElementTree import sys class XMLreader : class EchoTarget : def __init__(self) : self.level = 0 self.last_was_data = False # Ugh, this is so gross -- but ElementTree doesn't # give us any other way to remove the namespace. # There's supposed to be something called fixtag but # there's no documentation on what args it takes. @staticmethod def removeNS(nstag) : spl = nstag.split("}") if len(spl) > 1 : return spl[1] return spl def start(self, tag, attribs): #print("start %s %s" % (self.removeNS(tag), attrib)) sys.stdout.write("\n%s<%s" % (''.rjust(self.level * 2), self.removeNS(tag))) for key in attribs.keys() : sys.stdout.write(' %s="%s"' % (key, attribs[key])) sys.stdout.write(">") self.level += 1 self.last_was_data = False def end(self, tag): self.level -= 1 #print("%s" % (''.rjust(self.level * 2), self.removeNS(tag))) #print '\nlast_was_data:', self.last_was_data if not self.last_was_data : sys.stdout.write('\n%s' % ''.rjust(self.level * 2)) sys.stdout.write("" % self.removeNS(tag)) self.last_was_data = False def data(self, data) : if not data.isspace() : #print("%s%s" % (''.rjust(self.level * 2), data)) sys.stdout.write(data) self.last_was_data = True else : self.last_was_data = False def comment(self, text): sys.stdout.write("comment %s\n" % text) self.last_was_data = True def close(self): print("close") return "closed!" def parse(self, filename) : fp = open(filename) parser = xml.etree.ElementTree.XMLParser(target = self.EchoTarget()) try : while True : line = fp.readline() if not line: break parser.feed(line) except IOError : print "IOError, closing" try : fp.close() parser.close() except : print "ignoring any other errors" return parser.close() fp.close() # main if __name__ == "__main__" : xmlreader = XMLreader() xmlreader.parse(sys.argv[1])