| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  | import xml.sax | 
					
						
							|  |  |  | import xml.sax.handler | 
					
						
							| 
									
										
										
										
											2000-12-28 18:43:02 +00:00
										 |  |  | import types | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     _StringTypes = [types.StringType, types.UnicodeType] | 
					
						
							|  |  |  | except AttributeError: | 
					
						
							|  |  |  |     _StringTypes = [types.StringType] | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | START_ELEMENT = "START_ELEMENT" | 
					
						
							|  |  |  | END_ELEMENT = "END_ELEMENT" | 
					
						
							|  |  |  | COMMENT = "COMMENT" | 
					
						
							|  |  |  | START_DOCUMENT = "START_DOCUMENT" | 
					
						
							|  |  |  | END_DOCUMENT = "END_DOCUMENT" | 
					
						
							|  |  |  | PROCESSING_INSTRUCTION = "PROCESSING_INSTRUCTION" | 
					
						
							|  |  |  | IGNORABLE_WHITESPACE = "IGNORABLE_WHITESPACE" | 
					
						
							|  |  |  | CHARACTERS = "CHARACTERS" | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  | class PullDOM(xml.sax.ContentHandler): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  |     _locator = None | 
					
						
							|  |  |  |     document = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, documentFactory=None): | 
					
						
							|  |  |  |         self.documentFactory = documentFactory | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.firstEvent = [None, None] | 
					
						
							|  |  |  |         self.lastEvent = self.firstEvent | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         self.elementStack = [] | 
					
						
							|  |  |  |         self.push = self.elementStack.append | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             self.pop = self.elementStack.pop | 
					
						
							|  |  |  |         except AttributeError: | 
					
						
							|  |  |  |             # use class' pop instead | 
					
						
							|  |  |  |             pass | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |         self._ns_contexts = [{}] # contains uri -> prefix dicts | 
					
						
							|  |  |  |         self._current_context = self._ns_contexts[-1] | 
					
						
							| 
									
										
										
										
											2001-03-13 10:50:13 +00:00
										 |  |  |         self.pending_events = [] | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |     def pop(self): | 
					
						
							|  |  |  |         result = self.elementStack[-1] | 
					
						
							| 
									
										
										
										
											2001-01-27 08:47:37 +00:00
										 |  |  |         del self.elementStack[-1] | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         return result | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  |     def setDocumentLocator(self, locator): | 
					
						
							|  |  |  |         self._locator = locator | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |     def startPrefixMapping(self, prefix, uri): | 
					
						
							|  |  |  |         self._ns_contexts.append(self._current_context.copy()) | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  |         self._current_context[uri] = prefix or '' | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def endPrefixMapping(self, prefix): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  |         self._current_context = self._ns_contexts.pop() | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def startElementNS(self, name, tagName , attrs): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  |         uri, localname = name | 
					
						
							| 
									
										
										
										
											2000-10-06 22:36:03 +00:00
										 |  |  |         if uri: | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |             # When using namespaces, the reader may or may not | 
					
						
							|  |  |  |             # provide us with the original name. If not, create | 
					
						
							|  |  |  |             # *a* valid tagName from the current context. | 
					
						
							|  |  |  |             if tagName is None: | 
					
						
							| 
									
										
										
										
											2001-02-05 18:50:15 +00:00
										 |  |  |                 prefix = self._current_context[uri] | 
					
						
							|  |  |  |                 if prefix: | 
					
						
							|  |  |  |                     tagName = prefix + ":" + localname | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     tagName = localname | 
					
						
							| 
									
										
										
										
											2001-02-06 01:16:06 +00:00
										 |  |  |             if self.document: | 
					
						
							|  |  |  |                 node = self.document.createElementNS(uri, tagName) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 node = self.buildDocument(uri, tagName) | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             # When the tagname is not prefixed, it just appears as | 
					
						
							| 
									
										
										
										
											2000-10-06 22:36:03 +00:00
										 |  |  |             # localname | 
					
						
							| 
									
										
										
										
											2001-02-06 01:16:06 +00:00
										 |  |  |             if self.document: | 
					
						
							|  |  |  |                 node = self.document.createElement(localname) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 node = self.buildDocument(None, localname) | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for aname,value in attrs.items(): | 
					
						
							| 
									
										
										
										
											2000-10-06 22:36:03 +00:00
										 |  |  |             a_uri, a_localname = aname | 
					
						
							|  |  |  |             if a_uri: | 
					
						
							| 
									
										
										
										
											2001-02-05 18:50:15 +00:00
										 |  |  |                 prefix = self._current_context[a_uri] | 
					
						
							|  |  |  |                 if prefix: | 
					
						
							|  |  |  |                     qname = prefix + ":" + a_localname | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     qname = a_localname | 
					
						
							| 
									
										
										
										
											2000-10-06 22:36:03 +00:00
										 |  |  |                 attr = self.document.createAttributeNS(a_uri, qname) | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |             else: | 
					
						
							| 
									
										
										
										
											2000-10-06 22:36:03 +00:00
										 |  |  |                 attr = self.document.createAttribute(a_localname) | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |             attr.value = value | 
					
						
							| 
									
										
										
										
											2000-10-06 22:36:03 +00:00
										 |  |  |             node.setAttributeNode(attr) | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.lastEvent[1] = [(START_ELEMENT, node), None] | 
					
						
							|  |  |  |         self.lastEvent = self.lastEvent[1] | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         self.push(node) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |     def endElementNS(self, name, tagName): | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         self.lastEvent[1] = [(END_ELEMENT, self.pop()), None] | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.lastEvent = self.lastEvent[1] | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-11 22:34:04 +00:00
										 |  |  |     def startElement(self, name, attrs): | 
					
						
							| 
									
										
										
										
											2001-02-06 01:16:06 +00:00
										 |  |  |         if self.document: | 
					
						
							|  |  |  |             node = self.document.createElement(name) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             node = self.buildDocument(None, name) | 
					
						
							| 
									
										
										
										
											2000-10-11 22:34:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for aname,value in attrs.items(): | 
					
						
							|  |  |  |             attr = self.document.createAttribute(aname) | 
					
						
							|  |  |  |             attr.value = value | 
					
						
							|  |  |  |             node.setAttributeNode(attr) | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-11 22:34:04 +00:00
										 |  |  |         self.lastEvent[1] = [(START_ELEMENT, node), None] | 
					
						
							|  |  |  |         self.lastEvent = self.lastEvent[1] | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         self.push(node) | 
					
						
							| 
									
										
										
										
											2000-10-11 22:34:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def endElement(self, name): | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         self.lastEvent[1] = [(END_ELEMENT, self.pop()), None] | 
					
						
							| 
									
										
										
										
											2000-10-11 22:34:04 +00:00
										 |  |  |         self.lastEvent = self.lastEvent[1] | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def comment(self, s): | 
					
						
							| 
									
										
										
										
											2001-03-13 10:50:13 +00:00
										 |  |  |         if self.document: | 
					
						
							|  |  |  |             node = self.document.createComment(s) | 
					
						
							|  |  |  |             self.lastEvent[1] = [(COMMENT, node), None] | 
					
						
							|  |  |  |             self.lastEvent = self.lastEvent[1] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             event = [(COMMENT, s), None] | 
					
						
							|  |  |  |             self.pending_events.append(event) | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def processingInstruction(self, target, data): | 
					
						
							| 
									
										
										
										
											2001-03-13 10:50:13 +00:00
										 |  |  |         if self.document: | 
					
						
							|  |  |  |             node = self.document.createProcessingInstruction(target, data) | 
					
						
							|  |  |  |             self.lastEvent[1] = [(PROCESSING_INSTRUCTION, node), None] | 
					
						
							|  |  |  |             self.lastEvent = self.lastEvent[1] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             event = [(PROCESSING_INSTRUCTION, target, data), None] | 
					
						
							|  |  |  |             self.pending_events.append(event) | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def ignorableWhitespace(self, chars): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  |         node = self.document.createTextNode(chars) | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.lastEvent[1] = [(IGNORABLE_WHITESPACE, node), None] | 
					
						
							|  |  |  |         self.lastEvent = self.lastEvent[1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def characters(self, chars): | 
					
						
							|  |  |  |         node = self.document.createTextNode(chars) | 
					
						
							|  |  |  |         self.lastEvent[1] = [(CHARACTERS, node), None] | 
					
						
							|  |  |  |         self.lastEvent = self.lastEvent[1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def startDocument(self): | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  |         if self.documentFactory is None: | 
					
						
							|  |  |  |             import xml.dom.minidom | 
					
						
							|  |  |  |             self.documentFactory = xml.dom.minidom.Document.implementation | 
					
						
							| 
									
										
										
										
											2001-02-06 01:16:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def buildDocument(self, uri, tagname): | 
					
						
							|  |  |  |         # Can't do that in startDocument, since we need the tagname | 
					
						
							|  |  |  |         # XXX: obtain DocumentType | 
					
						
							|  |  |  |         node = self.documentFactory.createDocument(uri, tagname, None) | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         self.document = node | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.lastEvent[1] = [(START_DOCUMENT, node), None] | 
					
						
							|  |  |  |         self.lastEvent = self.lastEvent[1] | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         self.push(node) | 
					
						
							| 
									
										
										
										
											2001-03-13 10:50:13 +00:00
										 |  |  |         # Put everything we have seen so far into the document | 
					
						
							|  |  |  |         for e in self.pending_events: | 
					
						
							|  |  |  |             if e[0][0] == PROCESSING_INSTRUCTION: | 
					
						
							|  |  |  |                 _,target,data = e[0] | 
					
						
							|  |  |  |                 n = self.document.createProcessingInstruction(target, data) | 
					
						
							|  |  |  |                 e[0] = (PROCESSING_INSTRUCTION, n) | 
					
						
							|  |  |  |             elif e[0][0] == COMMENT: | 
					
						
							|  |  |  |                 n = self.document.createComment(e[0][1]) | 
					
						
							|  |  |  |                 e[0] = (COMMENT, n) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 raise AssertionError("Unknown pending event ",e[0][0]) | 
					
						
							|  |  |  |             self.lastEvent[1] = e | 
					
						
							|  |  |  |             self.lastEvent = e | 
					
						
							|  |  |  |         self.pending_events = None | 
					
						
							| 
									
										
										
										
											2001-02-06 01:16:06 +00:00
										 |  |  |         return node.firstChild | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def endDocument(self): | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         self.lastEvent[1] = [(END_DOCUMENT, self.document), None] | 
					
						
							|  |  |  |         self.pop() | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-06 01:16:06 +00:00
										 |  |  |     def clear(self): | 
					
						
							|  |  |  |         "clear(): Explicitly release parsing structures" | 
					
						
							|  |  |  |         self.document = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | class ErrorHandler: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def warning(self, exception): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         print exception | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def error(self, exception): | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  |         raise exception | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def fatalError(self, exception): | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  |         raise exception | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class DOMEventStream: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __init__(self, stream, parser, bufsize): | 
					
						
							|  |  |  |         self.stream = stream | 
					
						
							|  |  |  |         self.parser = parser | 
					
						
							|  |  |  |         self.bufsize = bufsize | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         self.reset() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def reset(self): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         self.pulldom = PullDOM() | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |         # This content handler relies on namespace support | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  |         self.parser.setFeature(xml.sax.handler.feature_namespaces, 1) | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         self.parser.setContentHandler(self.pulldom) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def __getitem__(self, pos): | 
					
						
							|  |  |  |         rc = self.getEvent() | 
					
						
							|  |  |  |         if rc: | 
					
						
							|  |  |  |             return rc | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         raise IndexError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     def expandNode(self, node): | 
					
						
							|  |  |  |         event = self.getEvent() | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         parents = [node] | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         while event: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             token, cur_node = event | 
					
						
							|  |  |  |             if cur_node is node: | 
					
						
							|  |  |  |                 return | 
					
						
							| 
									
										
										
										
											2000-10-13 20:53:27 +00:00
										 |  |  |             if token != END_ELEMENT: | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |                 parents[-1].appendChild(cur_node) | 
					
						
							|  |  |  |             if token == START_ELEMENT: | 
					
						
							|  |  |  |                 parents.append(cur_node) | 
					
						
							|  |  |  |             elif token == END_ELEMENT: | 
					
						
							|  |  |  |                 del parents[-1] | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             event = self.getEvent() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def getEvent(self): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         if not self.pulldom.firstEvent[1]: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             self.pulldom.lastEvent = self.pulldom.firstEvent | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         while not self.pulldom.firstEvent[1]: | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  |             buf = self.stream.read(self.bufsize) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |             if not buf: | 
					
						
							| 
									
										
										
										
											2001-01-27 08:34:21 +00:00
										 |  |  |                 self.parser.close() | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |                 return None | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |             self.parser.feed(buf) | 
					
						
							|  |  |  |         rc = self.pulldom.firstEvent[1][0] | 
					
						
							|  |  |  |         self.pulldom.firstEvent[1] = self.pulldom.firstEvent[1][1] | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |         return rc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-06 01:16:06 +00:00
										 |  |  |     def clear(self): | 
					
						
							|  |  |  |         "clear(): Explicitly release parsing objects" | 
					
						
							|  |  |  |         self.pulldom.clear() | 
					
						
							|  |  |  |         del self.pulldom | 
					
						
							|  |  |  |         self.parser = None | 
					
						
							|  |  |  |         self.stream = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-13 20:53:27 +00:00
										 |  |  | class SAX2DOM(PullDOM): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def startElementNS(self, name, tagName , attrs): | 
					
						
							|  |  |  |         PullDOM.startElementNS(self, name, tagName, attrs) | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         curNode = self.elementStack[-1] | 
					
						
							|  |  |  |         parentNode = self.elementStack[-2] | 
					
						
							|  |  |  |         parentNode.appendChild(curNode) | 
					
						
							| 
									
										
										
										
											2000-10-13 20:53:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def startElement(self, name, attrs): | 
					
						
							|  |  |  |         PullDOM.startElement(self, name, attrs) | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         curNode = self.elementStack[-1] | 
					
						
							|  |  |  |         parentNode = self.elementStack[-2] | 
					
						
							|  |  |  |         parentNode.appendChild(curNode) | 
					
						
							| 
									
										
										
										
											2000-10-13 20:53:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def processingInstruction(self, target, data): | 
					
						
							|  |  |  |         PullDOM.processingInstruction(self, target, data) | 
					
						
							|  |  |  |         node = self.lastEvent[0][1] | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         parentNode = self.elementStack[-1] | 
					
						
							|  |  |  |         parentNode.appendChild(node) | 
					
						
							| 
									
										
										
										
											2000-10-13 20:53:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def ignorableWhitespace(self, chars): | 
					
						
							|  |  |  |         PullDOM.ignorableWhitespace(self, chars) | 
					
						
							|  |  |  |         node = self.lastEvent[0][1] | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         parentNode = self.elementStack[-1] | 
					
						
							|  |  |  |         parentNode.appendChild(node) | 
					
						
							| 
									
										
										
										
											2000-10-13 20:53:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def characters(self, chars): | 
					
						
							|  |  |  |         PullDOM.characters(self, chars) | 
					
						
							|  |  |  |         node = self.lastEvent[0][1] | 
					
						
							| 
									
										
										
										
											2001-01-26 18:53:42 +00:00
										 |  |  |         parentNode = self.elementStack[-1] | 
					
						
							|  |  |  |         parentNode.appendChild(node) | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | default_bufsize = (2 ** 14) - 20 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-14 18:00:18 +00:00
										 |  |  | def parse(stream_or_string, parser=None, bufsize=None): | 
					
						
							|  |  |  |     if bufsize is None: | 
					
						
							|  |  |  |         bufsize = default_bufsize | 
					
						
							| 
									
										
										
										
											2000-12-28 18:43:02 +00:00
										 |  |  |     if type(stream_or_string) in _StringTypes: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         stream = open(stream_or_string) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         stream = stream_or_string | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  |     if not parser: | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |         parser = xml.sax.make_parser() | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     return DOMEventStream(stream, parser, bufsize) | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  | def parseString(string, parser=None): | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         from cStringIO import StringIO | 
					
						
							| 
									
										
										
										
											2000-06-29 19:39:57 +00:00
										 |  |  |     except ImportError: | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |         from StringIO import StringIO | 
					
						
							| 
									
										
										
										
											2000-10-23 18:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     bufsize = len(string) | 
					
						
							|  |  |  |     buf = StringIO(string) | 
					
						
							| 
									
										
										
										
											2000-09-24 21:54:14 +00:00
										 |  |  |     if not parser: | 
					
						
							|  |  |  |         parser = xml.sax.make_parser() | 
					
						
							| 
									
										
										
										
											2000-09-24 05:21:58 +00:00
										 |  |  |     return DOMEventStream(buf, parser, bufsize) |