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")
|