blob: f4e6ef53267d6225f7e0468c87f9d10eba7cb046 [file] [log] [blame]
Georg Brandl32855b62009-10-11 15:06:44 +00001"""
2A simple demo that reads in an XML document and displays the number of
3elements and attributes as well as a tally of elements and attributes by name.
4"""
5
Fred Drakeac5f7482000-10-16 15:27:05 +00006import sys
Georg Brandl32855b62009-10-11 15:06:44 +00007from collections import defaultdict
Fred Drakeac5f7482000-10-16 15:27:05 +00008
9from xml.sax import make_parser, handler
10
11class FancyCounter(handler.ContentHandler):
12
13 def __init__(self):
14 self._elems = 0
15 self._attrs = 0
Georg Brandl32855b62009-10-11 15:06:44 +000016 self._elem_types = defaultdict(int)
17 self._attr_types = defaultdict(int)
Fred Drakeac5f7482000-10-16 15:27:05 +000018
19 def startElement(self, name, attrs):
Georg Brandl32855b62009-10-11 15:06:44 +000020 self._elems += 1
21 self._attrs += len(attrs)
22 self._elem_types[name] += 1
Fred Drakeac5f7482000-10-16 15:27:05 +000023
24 for name in attrs.keys():
Georg Brandl32855b62009-10-11 15:06:44 +000025 self._attr_types[name] += 1
Fred Drakeac5f7482000-10-16 15:27:05 +000026
27 def endDocument(self):
28 print "There were", self._elems, "elements."
29 print "There were", self._attrs, "attributes."
30
31 print "---ELEMENT TYPES"
32 for pair in self._elem_types.items():
33 print "%20s %d" % pair
34
35 print "---ATTRIBUTE TYPES"
36 for pair in self._attr_types.items():
37 print "%20s %d" % pair
38
Georg Brandl32855b62009-10-11 15:06:44 +000039if __name__ == '__main__':
40 parser = make_parser()
41 parser.setContentHandler(FancyCounter())
42 parser.parse(sys.argv[1])