| """ | |
| A simple demo that reads in an XML document and displays the number of | |
| elements and attributes as well as a tally of elements and attributes by name. | |
| """ | |
| import sys | |
| from collections import defaultdict | |
| from xml.sax import make_parser, handler | |
| class FancyCounter(handler.ContentHandler): | |
| def __init__(self): | |
| self._elems = 0 | |
| self._attrs = 0 | |
| self._elem_types = defaultdict(int) | |
| self._attr_types = defaultdict(int) | |
| def startElement(self, name, attrs): | |
| self._elems += 1 | |
| self._attrs += len(attrs) | |
| self._elem_types[name] += 1 | |
| for name in attrs.keys(): | |
| self._attr_types[name] += 1 | |
| def endDocument(self): | |
| print "There were", self._elems, "elements." | |
| print "There were", self._attrs, "attributes." | |
| print "---ELEMENT TYPES" | |
| for pair in self._elem_types.items(): | |
| print "%20s %d" % pair | |
| print "---ATTRIBUTE TYPES" | |
| for pair in self._attr_types.items(): | |
| print "%20s %d" % pair | |
| if __name__ == '__main__': | |
| parser = make_parser() | |
| parser.setContentHandler(FancyCounter()) | |
| parser.parse(sys.argv[1]) |