1- import handler
2-
31"""An XML Reader is the SAX 2 name for an XML parser. XML Parsers
42should be based on this code. """
3+
4+ import handler
5+
56# ===== XMLREADER =====
67
78class 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+
218228def _test ():
219229 XMLReader ()
220230 IncrementalParser ()
221231 Locator ()
222232 AttributesImpl ()
223233
224- if __name__ == "__main__" :
234+ if __name__ == "__main__" :
225235 _test ()
0 commit comments