summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2000-10-06 21:08:59 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2000-10-06 21:08:59 (GMT)
commitee1dc157d7f425d8fdd12de098097441b4f17798 (patch)
treede99623762f47d2e7a103c2fae2655e6f98e4e97
parentc2bac8745dea66529205929fe5aced8c104267d9 (diff)
downloadcpython-ee1dc157d7f425d8fdd12de098097441b4f17798.zip
cpython-ee1dc157d7f425d8fdd12de098097441b4f17798.tar.gz
cpython-ee1dc157d7f425d8fdd12de098097441b4f17798.tar.bz2
Move translation from expat.error to SAXParseException into feed, so that
callers of feed will get a SAXException. In close, feed the last chunk first before calling endDocument, so that the parser may report errors before the end of the document. Don't do anything in a nested parser. Don't call endDocument in parse; that will be called in close. Use self._source for finding the SystemID; XML_GetBase will be cleared in case of an error.
-rw-r--r--Lib/xml/sax/expatreader.py36
1 files changed, 19 insertions, 17 deletions
diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py
index eb46bcd..cc2f7ea 100644
--- a/Lib/xml/sax/expatreader.py
+++ b/Lib/xml/sax/expatreader.py
@@ -39,13 +39,7 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
self._source = source
self.reset()
self._cont_handler.setDocumentLocator(self)
- try:
- xmlreader.IncrementalParser.parse(self, source)
- except expat.error:
- error_code = self._parser.ErrorCode
- raise SAXParseException(expat.ErrorString(error_code), None, self)
-
- self._cont_handler.endDocument()
+ xmlreader.IncrementalParser.parse(self, source)
def prepareParser(self, source):
if source.getSystemId() != None:
@@ -73,21 +67,29 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
# IncrementalParser methods
- def feed(self, data):
+ def feed(self, data, isFinal = 0):
if not self._parsing:
self._parsing = 1
self.reset()
self._cont_handler.startDocument()
- if not self._parser.Parse(data, 0):
- msg = pyexpat.ErrorString(self._parser.ErrorCode)
- raise SAXParseException(msg, None, self)
+ try:
+ # The isFinal parameter is internal to the expat reader.
+ # If it is set to true, expat will check validity of the entire
+ # document. When feeding chunks, they are not normally final -
+ # except when invoked from close.
+ self._parser.Parse(data, isFinal)
+ except expat.error:
+ error_code = self._parser.ErrorCode
+ raise SAXParseException(expat.ErrorString(error_code), None, self)
def close(self):
- if self._parsing:
- self._cont_handler.endDocument()
- self._parsing = 0
- self._parser.Parse("", 1)
+ if self._entity_stack:
+ # If we are completing an external entity, do nothing here
+ return
+ self.feed("", isFinal = 1)
+ self._cont_handler.endDocument()
+ self._parsing = 0
def reset(self):
if self._namespaces:
@@ -128,7 +130,7 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
return self._source.getPublicId()
def getSystemId(self):
- return self._parser.GetBase()
+ return self._source.getSystemId()
# event handlers
def start_element(self, name, attrs):
@@ -194,7 +196,7 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
try:
xmlreader.IncrementalParser.parse(self, source)
- self.close()
+ self._parser.Parse("",1)
except:
return 0 # FIXME: save error info here?