File: drv_ltdriver.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 (130 lines) | stat: -rw-r--r-- 3,148 bytes parent folder | download | duplicates (2)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
"""
A SAX driver for the LT XML Python interface.
"""

version="0.10"

from types import *
from xml.sax import saxlib,saxutils
from XMLinter import *

# --- The parser

class SAX_XMLinter(saxlib.Parser):

    def __init__(self):
        saxlib.Parser.__init__(self)
        
    def parse(self,sysID):
        self._parse(Open(sysID,NSL_read))

    def parseFile(self,file):
        self._parse(FOpen(file,NSL_read))

    def setLocale(self, locale):
        raise SAXException("Locales not supported")

    # --- EXPERIMENTAL PYTHON SAX EXTENSIONS:

    def get_parser_name(self):
        return "XMLinter"

    def get_parser_version(self):
        return "Unknown"

    def get_driver_version(self):
        return version
    
    def is_validating(self):
        return 0

    def is_dtd_reading(self):
        return 1

    def reset(self):
        raise SAXException("Incremental parsing not supported")
    
    def feed(self,data):
        raise SAXException("Incremental parsing not supported")

    def close(self):
        raise SAXException("Incremental parsing not supported")

    # --- INTERNAL METHODS

    def _parse(self,file):
        bit=GetNextBit(file)
        while bit:
            if bit.type=="start":
                self.doc_handler.startElement(bit.label,
                                              AttributeItem(bit.item))
            elif bit.type=="end":
                self.doc_handler.endElement(bit.label)
            elif bit.type=="text":
                self.doc_handler.characters(bit.body,0,len(bit.body))
            elif bit.type=="empty":
                self.doc_handler.startElement(bit.label,
                                              AttributeItem(bit.item))
                self.doc_handler.endElement(bit.label)
            elif bit.type=="bad":
                self.err_handler.fatalError(saxlib.SAXException("Syntax error",None))
            elif bit.type=="pi":
                print "?pi"
            else:
                print "###"+bit.type

            bit=GetNextBit(file)

# --- AttributeItem

def name(pair):
    return pair[0]

class AttributeItem:

    def __init__(self,item):
        self.item=item
        self.list=ItemActualAttributes(item)
    
    def getLength(self):
        return len(self.list)

    def getName(self, i):
        return self.list[i][0]

    def getType(self, i):
        return "CDATA"

    def getValue(self, i):
        if type(i)==StringType:
            return GetAttrVal(self.item,i)
        else:
            return self.list[i][1]

    def __len__(self):
        return len(self.list)

    def __getitem__(self, key):
        if type(key)==StringType:
            return GetAttrVal(self.item,key)
        else:
            return self.list[key][0]

    def keys(self):
        return map(name,self.list)

    def has_key(self, key):
        return GetAttrVal(self.item,key)
            
# --- Global functions

def create_parser():
    return SAX_XMLinter()
    
# --- Testing

if __name__=="__main__":
    p=create_parser()
    p.setDocumentHandler(saxutils.Canonizer())
    p.setErrorHandler(saxutils.ErrorPrinter())
    p.parse("tst.xml")