File: saxtrace.py

package info (click to toggle)
qm 1.1.3-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 8,628 kB
  • ctags: 10,249
  • sloc: python: 41,482; ansic: 20,611; xml: 12,837; sh: 485; makefile: 226
file content (71 lines) | stat: -rw-r--r-- 1,905 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"""
A minimal SAX application that just prints out the document-handler events
it receives.
"""

import sys
from xml.sax import saxexts

# --- SAXtracer

class SAXtracer:

    def __init__(self,objname):
        self.objname=objname
        self.met_name=""

    def __getattr__(self,name):
        self.met_name=name # UGLY! :)
        return self.trace

    def error(self,exception):
        print "err_handler.error(%s)" % str(exception)

    def fatalError(self,exception):
        print "err_handler.fatalError(%s)" % str(exception)

    def warning(self,exception):
        print "err_handler.warning(%s)" % str(exception)
        
    def characters(self,data,start,length):
        print "doc_handler.characters(%s,%d,%d)" % (`data[start:start+length]`,
                                                    start,length)

    def ignorableWhitespace(self,data,start,length):
        print "doc_handler.ignorableWhitespace(%s,%d,%d)" % \
              (`data[start:start+length]`,start,length)
        
    def startElement(self, name, attrs):
        attr_str="{"
        for attr in attrs:
            attr_str="%s '%s':'%s'," % (attr_str,attr,attrs[attr])

        if attr_str=="{":
            attr_str="{}"
        else:
            attr_str=attr_str[:-1]+" }"
            
        print "doc_handler.startElement('%s',%s)" % (name,attr_str)
        
    def trace(self,*rest):
        str="%s.%s(" % (self.objname,self.met_name)

        for param in rest[:-1]:
            str=str+`param`+", "

        if len(rest)>0:
            print str+`rest[-1]`+")"
        else:
            print str+")"

# --- Main prog

pf=saxexts.ParserFactory()
p=pf.make_parser("xml.sax.drivers.drv_xmlproc")

p.setDocumentHandler(SAXtracer("doc_handler"))
p.setDTDHandler(SAXtracer("dtd_handler"))
p.setErrorHandler(SAXtracer("err_handler"))
p.setEntityResolver(SAXtracer("ent_handler"))
p.parse(sys.argv[1])