[XML-SIG] SAX with DTD
Juergen Hermann
Juergen Hermann" <jhe@webde-ag.de
Fri, 13 Jul 2001 11:10:06 +0200
On Thu, 12 Jul 2001 16:23:03 -0700 (PDT), Hung Jung Lu wrote:
>(2) I have a DTD that specifies default attributes
>(via #FIXED) of an XML document. Is there some parser
>(DOM preferred, SAX ok) in Python that can take into
>account the attributes specified in DTD?
This is a full SAX example:
import os
import xml.sax
import xml.sax.saxutils
import xml.sax.handler
import xml.sax.sax2exts
class CopsConfigHandler(xml.sax.saxutils.DefaultHandler):
xmlns_copscfg = u'http://www.cinetic.de/2000/COPS/Config'
_debug = 0
def __init__(self, configfile):
self.configfile = 'file://' + os.path.abspath(configfile)
self.params = {}
self.in_parameters = 0
# create parser
parser = xml.sax.sax2exts.XMLValParserFactory.make_parser()
##print '+++ parser is', parser
parser.setFeature(xml.sax.handler.feature_namespaces, 1)
parser.setFeature(xml.sax.handler.feature_validation, 0)
parser.setFeature(xml.sax.handler.feature_external_ges, 1)
parser.setFeature(xml.sax.handler.feature_external_pes, 1)
# set handlers
parser.setContentHandler(self)
parser.setDTDHandler(self)
if not self._debug:
# no tracebacks, print error msg only!
parser.setErrorHandler(self)
parser.setEntityResolver(self)
# parse the XML into events
parser.parse(self.configfile)
### error handler events
def error(self,exception):
raise exception
def fatalError(self,exception):
raise exception
def warning(self,exception):
sys.stderr.write("*** warning %s\n" % (str(exception),))
### document handler events
def startElementNS(self, name, qname, attrs):
if name[0] == self.xmlns_copscfg:
##print name, qname, attrs.items()
if name[1] == "parameters":
self.in_parameters = 1
elif self.in_parameters and name[1] == "param":
##print '+++ attrs', attrs._attrs
##print '+++ qnames', attrs._qnames
name = attrs.getValueByQName('name')
value = attrs.getValueByQName('value')
self.params[name] = value
def endElementNS(self, name, qname):
if name[0] == self.xmlns_copscfg:
if name[1] == "parameters":
self.in_parameters = 0
if __name__ == "__main__":
copsconfig = CopsConfigHandler(os.path.join('conf', 'cops-config.xml'))
keys = copsconfig.params.keys()
keys.sort()
klen = reduce(max, map(len, keys), 0)
for key in keys:
print key.ljust(klen), repr(copsconfig.params[key])