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