[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])