• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""
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
6import sys
7from collections import defaultdict
8
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
16        self._elem_types = defaultdict(int)
17        self._attr_types = defaultdict(int)
18
19    def startElement(self, name, attrs):
20        self._elems += 1
21        self._attrs += len(attrs)
22        self._elem_types[name] += 1
23
24        for name in attrs.keys():
25            self._attr_types[name] += 1
26
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
39if __name__ == '__main__':
40    parser = make_parser()
41    parser.setContentHandler(FancyCounter())
42    parser.parse(sys.argv[1])
43