summaryrefslogtreecommitdiffstats
path: root/Lib/xml
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/xml')
-rw-r--r--Lib/xml/sax/expatreader.py34
1 files changed, 28 insertions, 6 deletions
diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py
index b1d4c97..b8a31ff 100644
--- a/Lib/xml/sax/expatreader.py
+++ b/Lib/xml/sax/expatreader.py
@@ -6,6 +6,13 @@ pyexpat.__version__ == '2.22'.
version = "0.20"
from xml.sax._exceptions import *
+
+# xml.parsers.expat does not raise ImportError in Jython
+import sys
+if sys.platform[ : 4] == "java":
+ raise SAXReaderNotAvailable("expat not available in Java", None)
+del sys
+
try:
from xml.parsers import expat
except ImportError:
@@ -46,6 +53,13 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
if source.getSystemId() != None:
self._parser.SetBase(source.getSystemId())
+ # Redefined setContentHandle to allow changing handlers during parsing
+
+ def setContentHandler(self, handler):
+ xmlreader.IncrementalParser.setContentHandler(self, handler)
+ if self._parsing:
+ self._reset_cont_handler()
+
def getFeature(self, name):
if name == handler.feature_namespaces:
return self._namespaces
@@ -68,6 +82,8 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
def setProperty(self, name, value):
if name == handler.property_lexical_handler:
self._lex_handler_prop = value
+ if self._parsing:
+ self._reset_lex_handler_prop()
else:
raise SAXNotRecognizedException("Property '%s' not recognized" % name)
@@ -101,6 +117,16 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
# break cycle created by expat handlers pointing to our methods
self._parser = None
+ def _reset_cont_handler(self):
+ self._parser.ProcessingInstructionHandler = \
+ self._cont_handler.processingInstruction
+ self._parser.CharacterDataHandler = self._cont_handler.characters
+
+ def _reset_lex_handler_prop(self):
+ self._parser.CommentHandler = self._lex_handler_prop.comment
+ self._parser.StartCdataSectionHandler = self._lex_handler_prop.startCDATA
+ self._parser.EndCdataSectionHandler = self._lex_handler_prop.endCDATA
+
def reset(self):
if self._namespaces:
self._parser = expat.ParserCreate(None, " ")
@@ -111,9 +137,7 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
self._parser.StartElementHandler = self.start_element
self._parser.EndElementHandler = self.end_element
- self._parser.ProcessingInstructionHandler = \
- self._cont_handler.processingInstruction
- self._parser.CharacterDataHandler = self._cont_handler.characters
+ self._reset_cont_handler()
self._parser.UnparsedEntityDeclHandler = self.unparsed_entity_decl
self._parser.NotationDeclHandler = self.notation_decl
self._parser.StartNamespaceDeclHandler = self.start_namespace_decl
@@ -121,9 +145,7 @@ class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
self._decl_handler_prop = None
if self._lex_handler_prop:
- self._parser.CommentHandler = self._lex_handler_prop.comment
- self._parser.StartCdataSectionHandler = self._lex_handler_prop.startCDATA
- self._parser.EndCdataSectionHandler = self._lex_handler_prop.endCDATA
+ self._reset_lex_handler_prop()
# self._parser.DefaultHandler =
# self._parser.DefaultHandlerExpand =
# self._parser.NotStandaloneHandler =