xmlreader.py revision f9059ebede7acc7d498d0703dd97adede37c5016
145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport handler
245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake"""An XML Reader is the SAX 2 name for an XML parser. XML Parsers
445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeshould be based on this code. """
545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake# ===== XMLREADER =====
645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeclass XMLReader:
845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def __init__(self):
9f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        self._cont_handler = handler.ContentHandler()
10f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        #self._dtd_handler  = handler.DTDHandler()
11f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        #self._ent_handler  = handler.EntityResolver()
12f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        self._err_handler  = handler.ErrorHandler()
1345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
1445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def parse(self, source):
15f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        "Parse an XML document from a system identifier or an InputSource."
1645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise NotImplementedError("This method must be implemented!")
1745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
1845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getContentHandler(self):
1945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        "Returns the current ContentHandler."
2045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._cont_handler
2145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
2245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def setContentHandler(self, handler):
2345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        "Registers a new object to receive document content events."
2445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        self._cont_handler = handler
2545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
2645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getDTDHandler(self):
2745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        "Returns the current DTD handler."
2845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._dtd_handler
2945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
3045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def setDTDHandler(self, handler):
31f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        "Register an object to receive basic DTD-related events."
32f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        self._dtd_handler = handler
3345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
3445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getEntityResolver(self):
3545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        "Returns the current EntityResolver."
3645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._ent_handler
3745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
3845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def setEntityResolver(self, resolver):
39f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        "Register an object to resolve external entities."
40f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        self._ent_handler = resolver
4145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
4245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getErrorHandler(self):
4345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        "Returns the current ErrorHandler."
4445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._err_handler
4545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
4645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def setErrorHandler(self, handler):
47f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        "Register an object to receive error-message events."
48f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        self._err_handler = handler
4945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
5045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def setLocale(self, locale):
5145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        """Allow an application to set the locale for errors and warnings.
5245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
5345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        SAX parsers are not required to provide localisation for errors
5445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        and warnings; if they cannot support the requested locale,
5545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        however, they must throw a SAX exception. Applications may
5645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        request a locale change in the middle of a parse."""
5745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise SAXNotSupportedException("Locale support not implemented")
5845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
5945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getFeature(self, name):
6045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        "Looks up and returns the state of a SAX2 feature."
6145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise SAXNotRecognizedException("Feature '%s' not recognized" % name)
6245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
6345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def setFeature(self, name, state):
6445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        "Sets the state of a SAX2 feature."
6545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise SAXNotRecognizedException("Feature '%s' not recognized" % name)
6645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
6745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getProperty(self, name):
6845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        "Looks up and returns the value of a SAX2 property."
6945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise SAXNotRecognizedException("Property '%s' not recognized" % name)
7045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
7145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def setProperty(self, name, value):
7245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        "Sets the value of a SAX2 property."
7345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise SAXNotRecognizedException("Property '%s' not recognized" % name)
7445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
7545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
7645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeclass IncrementalParser(XMLReader):
7745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    """This interface adds three extra methods to the XMLReader
7845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    interface that allow XML parsers to support incremental
7945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    parsing. Support for this interface is optional, since not all
8045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    underlying XML parsers support this functionality.
8145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
8245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    When the parser is instantiated it is ready to begin accepting
8345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    data from the feed method immediately. After parsing has been
8445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    finished with a call to close the reset method must be called to
8545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    make the parser ready to accept new data, either from feed or
8645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    using the parse method.
8745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
8845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    Note that these methods must _not_ be called during parsing, that
8945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    is, after parse has been called and before it returns.
9045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
9145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    By default, the class also implements the parse method of the XMLReader
9245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    interface using the feed, close and reset methods of the
9345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    IncrementalParser interface as a convenience to SAX 2.0 driver
9445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    writers."""
9545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def __init__(self, bufsize=2**16 ):
9645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        self._bufsize=bufsize
9745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        XMLReader.__init__( self )
9845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
9945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def parse(self, source):
10045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        self.prepareParser(source)
10145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        #FIXME: do some type checking: could be already stream, URL or
10245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        #       filename
10345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        inf=open( source )
10445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        buffer = inf.read(self._bufsize)
10545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        while buffer != "":
10645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            self.feed(buffer)
10745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            buffer = inf.read(self._bufsize)
10845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        self.close()
10945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        self.reset()
11045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
11145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def feed(self, data):
11245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        """This method gives the raw XML data in the data parameter to
11345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        the parser and makes it parse the data, emitting the
11445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        corresponding events. It is allowed for XML constructs to be
11545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        split across several calls to feed.
11645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
11745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        feed may raise SAXException."""
11845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise NotImplementedError("This method must be implemented!")
11945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def prepareParser(self, source):
12045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        """This method is called by the parse implementation to allow
12145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        the SAX 2.0 driver to prepare itself for parsing."""
12245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise NotImplementedError("prepareParser must be overridden!")
12345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
12445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def close(self):
12545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        """This method is called when the entire XML document has been
12645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        passed to the parser through the feed method, to notify the
12745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        parser that there are no more data. This allows the parser to
12845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        do the final checks on the document and empty the internal
12945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        data buffer.
13045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
13145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        The parser will not be ready to parse another document until
13245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        the reset method has been called.
13345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
13445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        close may raise SAXException."""
13545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise NotImplementedError("This method must be implemented!")
13645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
13745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def reset(self):
13845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        """This method is called after close has been called to reset
13945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        the parser so that it is ready to parse new documents. The
14045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        results of calling parse or feed after close without calling
14145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        reset are undefined."""
14245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        raise NotImplementedError("This method must be implemented!")
14345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
14445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake# ===== LOCATOR =====
14545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeclass Locator:
14645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    """Interface for associating a SAX event with a document
14745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    location. A locator object will return valid results only during
14845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    calls to DocumentHandler methods; at any other time, the
14945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    results are unpredictable."""
15045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
15145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getColumnNumber(self):
152f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        "Return the column number where the current event ends."
153f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        return -1
15445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
15545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getLineNumber(self):
156f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        "Return the line number where the current event ends."
157f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        return -1
15845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
15945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getPublicId(self):
160f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        "Return the public identifier for the current event."
161f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        return None
16245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
16345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getSystemId(self):
164f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        "Return the system identifier for the current event."
165f9059ebede7acc7d498d0703dd97adede37c5016Skip Montanaro        return None
16645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
16745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake# --- AttributesImpl
16845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeclass AttributesImpl:
16945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def __init__(self, attrs, rawnames):
17045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        self._attrs = attrs
17145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        self._rawnames = rawnames
17245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
17345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getLength(self):
17445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return len(self._attrs)
17545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
17645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getType(self, name):
17745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return "CDATA"
17845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
17945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getValue(self, name):
18045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._attrs[name]
18145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
18245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getValueByQName(self, name):
18345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._attrs[self._rawnames[name]]
18445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
18545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getNameByQName(self, name):
18645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._rawnames[name]
18745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
18845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getNames(self):
18945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._attrs.keys()
19045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
19145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def getQNames(self):
19245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._rawnames.keys()
19345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
19445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def __len__(self):
19545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return len(self._attrs)
19645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
19745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def __getitem__(self, name):
19845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._attrs[name]
19945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
20045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def keys(self):
20145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._attrs.keys()
20245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
20345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def has_key(self, name):
20445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._attrs.has_key(name)
20545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
20645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def get(self, name, alternative=None):
20745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._attrs.get(name, alternative)
20845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
20945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def copy(self):
21045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self.__class__(self._attrs, self._rawnames)
21145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
21245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def items(self):
21345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._attrs.items()
21445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
21545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    def values(self):
21645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        return self._attrs.values()
21745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
21845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakedef _test():
21945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    XMLReader()
22045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    IncrementalParser()
22145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    Locator()
22245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    AttributesImpl()
22345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
22445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeif __name__=="__main__":
22545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    _test()
226