Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 07cbc4e

Browse files
committed
Paul Prescod <[email protected]>:
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.
1 parent 5644b7f commit 07cbc4e

1 file changed

Lines changed: 27 additions & 17 deletions

File tree

Lib/xml/sax/xmlreader.py

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
import handler
2-
31
"""An XML Reader is the SAX 2 name for an XML parser. XML Parsers
42
should be based on this code. """
3+
4+
import handler
5+
56
# ===== XMLREADER =====
67

78
class XMLReader:
89
def __init__(self):
910
self._cont_handler = handler.ContentHandler()
10-
#self._dtd_handler = handler.DTDHandler()
11-
#self._ent_handler = handler.EntityResolver()
12-
self._err_handler = handler.ErrorHandler()
11+
#self._dtd_handler = handler.DTDHandler()
12+
#self._ent_handler = handler.EntityResolver()
13+
self._err_handler = handler.ErrorHandler()
1314

1415
def parse(self, source):
1516
"Parse an XML document from a system identifier or an InputSource."
@@ -92,22 +93,29 @@ class IncrementalParser(XMLReader):
9293
interface using the feed, close and reset methods of the
9394
IncrementalParser interface as a convenience to SAX 2.0 driver
9495
writers."""
95-
def __init__(self, bufsize=2**16 ):
96-
self._bufsize=bufsize
97-
XMLReader.__init__( self )
98-
99-
def parse(self, source):
100-
self.prepareParser(source)
101-
#FIXME: do some type checking: could be already stream, URL or
102-
# filename
103-
inf=open( source )
104-
buffer = inf.read(self._bufsize)
96+
97+
def __init__(self, bufsize=2**16):
98+
self._bufsize = bufsize
99+
XMLReader.__init__(self)
100+
101+
def _parseOpenFile(self, source):
102+
buffer = source.read(self._bufsize)
105103
while buffer != "":
106104
self.feed(buffer)
107-
buffer = inf.read(self._bufsize)
105+
buffer = source.read(self._bufsize)
108106
self.close()
109107
self.reset()
110108

109+
def parse(self, source):
110+
if hasattr(source, "read"):
111+
self._parseOpenFile(source)
112+
else:
113+
#FIXME: how to recognize if it is a URL instead of filename?
114+
self.prepareParser(source)
115+
file = open(source)
116+
self._parseOpenFile(file)
117+
file.close()
118+
111119
def feed(self, data):
112120
"""This method gives the raw XML data in the data parameter to
113121
the parser and makes it parse the data, emitting the
@@ -116,6 +124,7 @@ def feed(self, data):
116124
117125
feed may raise SAXException."""
118126
raise NotImplementedError("This method must be implemented!")
127+
119128
def prepareParser(self, source):
120129
"""This method is called by the parse implementation to allow
121130
the SAX 2.0 driver to prepare itself for parsing."""
@@ -215,11 +224,12 @@ def items(self):
215224
def values(self):
216225
return self._attrs.values()
217226

227+
218228
def _test():
219229
XMLReader()
220230
IncrementalParser()
221231
Locator()
222232
AttributesImpl()
223233

224-
if __name__=="__main__":
234+
if __name__ == "__main__":
225235
_test()

0 commit comments

Comments
 (0)