Commit 9d065951 authored by Fred Drake's avatar Fred Drake

Synchronize with pulldom from PyXML (revision 1.18).

parent c5cfd4b6
...@@ -48,7 +48,7 @@ class PullDOM(xml.sax.ContentHandler): ...@@ -48,7 +48,7 @@ class PullDOM(xml.sax.ContentHandler):
self._xmlns_attrs = [] self._xmlns_attrs = []
self._xmlns_attrs.append((prefix or 'xmlns', uri)) self._xmlns_attrs.append((prefix or 'xmlns', uri))
self._ns_contexts.append(self._current_context.copy()) self._ns_contexts.append(self._current_context.copy())
self._current_context[uri] = prefix or '' self._current_context[uri] = prefix or None
def endPrefixMapping(self, prefix): def endPrefixMapping(self, prefix):
self._current_context = self._ns_contexts.pop() self._current_context = self._ns_contexts.pop()
...@@ -211,6 +211,8 @@ class DOMEventStream: ...@@ -211,6 +211,8 @@ class DOMEventStream:
self.stream = stream self.stream = stream
self.parser = parser self.parser = parser
self.bufsize = bufsize self.bufsize = bufsize
if not hasattr(self.parser, 'feed'):
self.getEvent = self._slurp
self.reset() self.reset()
def reset(self): def reset(self):
...@@ -241,6 +243,8 @@ class DOMEventStream: ...@@ -241,6 +243,8 @@ class DOMEventStream:
event = self.getEvent() event = self.getEvent()
def getEvent(self): def getEvent(self):
# use IncrementalParser interface, so we get the desired
# pull effect
if not self.pulldom.firstEvent[1]: if not self.pulldom.firstEvent[1]:
self.pulldom.lastEvent = self.pulldom.firstEvent self.pulldom.lastEvent = self.pulldom.firstEvent
while not self.pulldom.firstEvent[1]: while not self.pulldom.firstEvent[1]:
...@@ -253,8 +257,26 @@ class DOMEventStream: ...@@ -253,8 +257,26 @@ class DOMEventStream:
self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1] self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1]
return rc return rc
def _slurp(self):
""" Fallback replacement for getEvent() using the
standard SAX2 interface, which means we slurp the
SAX events into memory (no performance gain, but
we are compatible to all SAX parsers).
"""
self.parser.parse(self.stream)
self.getEvent = self._emit
return self._emit()
def _emit(self):
""" Fallback replacement for getEvent() that emits
the events that _slurp() read previously.
"""
rc = self.pulldom.firstEvent[1][0]
self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1]
return rc
def clear(self): def clear(self):
"clear(): Explicitly release parsing objects" """clear(): Explicitly release parsing objects"""
self.pulldom.clear() self.pulldom.clear()
del self.pulldom del self.pulldom
self.parser = None self.parser = None
......
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