Kaydet (Commit) 07cbc4e5 authored tarafından Fred Drake's avatar Fred Drake

Paul Prescod <paul@prescod.net>:

Add support for parsing already-opened files.  Make sure the parse()
method closes exactly those files that it opens.

Modified by FLD for better conformance to the Python style guide.

This closes SourceForge patch #101512.
üst 5644b7fa
import handler
"""An XML Reader is the SAX 2 name for an XML parser. XML Parsers """An XML Reader is the SAX 2 name for an XML parser. XML Parsers
should be based on this code. """ should be based on this code. """
import handler
# ===== XMLREADER ===== # ===== XMLREADER =====
class XMLReader: class XMLReader:
def __init__(self): def __init__(self):
self._cont_handler = handler.ContentHandler() self._cont_handler = handler.ContentHandler()
#self._dtd_handler = handler.DTDHandler() #self._dtd_handler = handler.DTDHandler()
#self._ent_handler = handler.EntityResolver() #self._ent_handler = handler.EntityResolver()
self._err_handler = handler.ErrorHandler() self._err_handler = handler.ErrorHandler()
def parse(self, source): def parse(self, source):
"Parse an XML document from a system identifier or an InputSource." "Parse an XML document from a system identifier or an InputSource."
...@@ -92,22 +93,29 @@ class IncrementalParser(XMLReader): ...@@ -92,22 +93,29 @@ class IncrementalParser(XMLReader):
interface using the feed, close and reset methods of the interface using the feed, close and reset methods of the
IncrementalParser interface as a convenience to SAX 2.0 driver IncrementalParser interface as a convenience to SAX 2.0 driver
writers.""" writers."""
def __init__(self, bufsize=2**16 ):
self._bufsize=bufsize def __init__(self, bufsize=2**16):
XMLReader.__init__( self ) self._bufsize = bufsize
XMLReader.__init__(self)
def parse(self, source):
self.prepareParser(source) def _parseOpenFile(self, source):
#FIXME: do some type checking: could be already stream, URL or buffer = source.read(self._bufsize)
# filename
inf=open( source )
buffer = inf.read(self._bufsize)
while buffer != "": while buffer != "":
self.feed(buffer) self.feed(buffer)
buffer = inf.read(self._bufsize) buffer = source.read(self._bufsize)
self.close() self.close()
self.reset() self.reset()
def parse(self, source):
if hasattr(source, "read"):
self._parseOpenFile(source)
else:
#FIXME: how to recognize if it is a URL instead of filename?
self.prepareParser(source)
file = open(source)
self._parseOpenFile(file)
file.close()
def feed(self, data): def feed(self, data):
"""This method gives the raw XML data in the data parameter to """This method gives the raw XML data in the data parameter to
the parser and makes it parse the data, emitting the the parser and makes it parse the data, emitting the
...@@ -116,6 +124,7 @@ class IncrementalParser(XMLReader): ...@@ -116,6 +124,7 @@ class IncrementalParser(XMLReader):
feed may raise SAXException.""" feed may raise SAXException."""
raise NotImplementedError("This method must be implemented!") raise NotImplementedError("This method must be implemented!")
def prepareParser(self, source): def prepareParser(self, source):
"""This method is called by the parse implementation to allow """This method is called by the parse implementation to allow
the SAX 2.0 driver to prepare itself for parsing.""" the SAX 2.0 driver to prepare itself for parsing."""
...@@ -215,11 +224,12 @@ class AttributesImpl: ...@@ -215,11 +224,12 @@ class AttributesImpl:
def values(self): def values(self):
return self._attrs.values() return self._attrs.values()
def _test(): def _test():
XMLReader() XMLReader()
IncrementalParser() IncrementalParser()
Locator() Locator()
AttributesImpl() AttributesImpl()
if __name__=="__main__": if __name__ == "__main__":
_test() _test()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment