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