|
|
""" |
""" |
|
|
|
_parser = _url = None |
|
|
def __init__(self): |
def __init__(self): |
self.element_map = {} |
self.element_map = {} |
self.attribute_map = {} |
self.attribute_map = {} |
return '',name |
return '',name |
|
|
|
|
|
|
|
|
def startElement(self,name,attrs): |
def startElement(self,name,attrs): |
|
if self.stack[-1].get('empty'): self.err("Child elements not allowed") |
a = []; append = a.append; negattrs=[] |
a = []; append = a.append; negattrs=[] |
attrs.reverse(); pop = attrs.pop |
attrs.reverse(); pop = attrs.pop |
data = {'name':name, 'attributes':a, 'previous':self.stack[-1]} |
data = {'name':name, 'attributes':a, 'previous':self.stack[-1]} |
if 'lookups' in data: |
if 'lookups' in data: |
self.lookup_element, self.lookup_attribute = data['lookups'] |
self.lookup_element, self.lookup_attribute = data['lookups'] |
|
|
|
|
def resetCaches(self): |
def resetCaches(self): |
data = self.stack[-1] |
data = self.stack[-1] |
if 'caches' not in data: |
if 'caches' not in data: |
|
|
self.attribute_map, self.element_map = {}, {} |
self.attribute_map, self.element_map = {}, {} |
|
|
|
def err(self,msg,kind=SyntaxError): |
|
"""Generate an error with current parse location""" |
|
exc = kind() |
|
exc.msg = msg |
|
exc.filename = self._url |
|
if self._parser: |
|
exc.text = self._parser.GetInputContext() |
|
exc.lineno = self._parser.CurrentLineNumber |
|
exc.offset = self._parser.CurrentColumnNumber |
|
else: |
|
exc.lineno = exc.offset = exc.text = None |
|
exc.args = msg, (exc.filename,exc.lineno,exc.offset,exc.text) |
|
raise exc |
|
|
def setLookups(self,element=None,attribute=None): |
def setLookups(self,element=None,attribute=None): |
self.resetCaches() |
self.resetCaches() |
|
|
|
|
def makeParser(self): |
def makeParser(self): |
from xml.parsers.expat import ParserCreate |
from pyexpat import ParserCreate |
p = ParserCreate() |
p = ParserCreate() |
p.ordered_attributes = True |
p.ordered_attributes = True |
p.returns_unicode = True |
p.returns_unicode = True |
return p |
return p |
|
|
|
|
def _beforeParsing(self,root=None): |
def _beforeParsing(self,root=None,url=None): |
root = root or {} |
root = root or {} |
self.stack.append(root) |
self.stack.append(root) |
return self.makeParser() |
p = self.makeParser() |
|
self._parser = p; self._url = url |
|
return p |
|
|
def _afterParsing(self): |
def _afterParsing(self): |
data = self.stack.pop() |
data = self.stack.pop() |
finish = data.get('finish') |
finish = data.get('finish') |
|
try: |
if finish: |
if finish: |
return finish(self,data) |
return finish(self,data) |
|
finally: |
|
del self._parser, self._url |
|
|
|
def parseString(self,text,root=None,url=None): |
def parseString(self,text,root=None): |
self._beforeParsing(root,url).Parse(text,True) |
self._beforeParsing(root).Parse(text,True) |
|
return self._afterParsing() |
return self._afterParsing() |
|
|
|
|
def parseStream(self,stream,root=None): |
def parseStream(self,stream,root=None,url=None): |
self._beforeParsing(root).ParseFile(stream) |
self._beforeParsing(root,url).ParseFile(stream) |
return self._afterParsing() |
return self._afterParsing() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ExpatBuilder: |
class ExpatBuilder: |
|
|
"""Parser that assembles a document""" |
"""Parser that assembles a document""" |
self.nsInfo = {} # URI stack for each NS prefix |
self.nsInfo = {} # URI stack for each NS prefix |
|
|
def makeParser(self): |
def makeParser(self): |
from xml.parsers.expat import ParserCreate |
from pyexpat import ParserCreate |
p = ParserCreate() |
p = ParserCreate() |
p.ordered_attributes = True |
p.ordered_attributes = True |
p.returns_unicode = True |
p.returns_unicode = True |