from xml.dom import pulldom import sys class XMLStreamReader(): """ XMLStreamReader: simplified interface to DOMEventStream so that it looks similar to the Java XMLStreamReader with similar methods It concatenates all successive text nodes """ def __init__(self, file): self.events = pulldom.parse(file) self.event = None self.node = None self.look_ahead=None # get next token def next(self): if self.look_ahead == None: (self.event,self.node)=self.events.getEvent() else: (self.event,self.node)=self.look_ahead self.look_ahead=None # concatenate consecutive character nodes while self.event == pulldom.CHARACTERS: self.look_ahead=self.events.__next__() while self.look_ahead[0] == pulldom.CHARACTERS: self.look_ahead=self.events.getEvent() break def isWhiteSpace(self): return (self.event == pulldom.CHARACTERS and len(self.node.data.strip())==0) def isStartElement(self): return self.event == pulldom.START_ELEMENT def isEndElement(self): return self.event == pulldom.END_ELEMENT def isCharacters(self): return self.event == pulldom.CHARACTERS def checkStartElement(self,method): if not self.isStartElement(): raise ValueError("%s called for an event of type: %s"% (method,self.event)) def getLocalName(self): self.checkStartElement("getLocalName") return self.node.localName def getAttributeCount(self): self.checkStartElement("getAttributeCount") return self.node.attributes.length def getAttributeLocalName(self,i): self.checkStartElement("getAttributeLocalName") return self.node.attributes.item(i).localName def getAttributeValue(self,i): self.checkStartElement("getAttributeValue") return self.node.attributes.item(i).value def getText(self): if not self.isCharacters(): raise ValueError("getText called for an event of type %s"% self.event) return self.node.data