2005-12-14 14:46:16 -04:00
|
|
|
# Wrapper module for _elementtree
|
|
|
|
|
2012-02-11 06:28:16 -04:00
|
|
|
from xml.etree.ElementTree import (ElementTree, dump, iselement, QName,
|
|
|
|
fromstringlist,
|
|
|
|
tostring, tostringlist, VERSION)
|
|
|
|
# These ones are not in ElementTree.__all__
|
|
|
|
from xml.etree.ElementTree import ElementPath, register_namespace
|
|
|
|
|
|
|
|
# Import the C accelerators:
|
|
|
|
# Element, SubElement, TreeBuilder, XMLParser, ParseError
|
2005-12-14 14:46:16 -04:00
|
|
|
from _elementtree import *
|
2012-02-11 06:28:16 -04:00
|
|
|
|
|
|
|
|
|
|
|
class ElementTree(ElementTree):
|
|
|
|
|
|
|
|
def parse(self, source, parser=None):
|
|
|
|
close_source = False
|
|
|
|
if not hasattr(source, 'read'):
|
|
|
|
source = open(source, 'rb')
|
|
|
|
close_source = True
|
|
|
|
try:
|
|
|
|
if parser is not None:
|
|
|
|
while True:
|
|
|
|
data = source.read(65536)
|
|
|
|
if not data:
|
|
|
|
break
|
|
|
|
parser.feed(data)
|
|
|
|
self._root = parser.close()
|
|
|
|
else:
|
|
|
|
parser = XMLParser()
|
|
|
|
self._root = parser._parse(source)
|
|
|
|
return self._root
|
|
|
|
finally:
|
|
|
|
if close_source:
|
|
|
|
source.close()
|
|
|
|
|
|
|
|
|
|
|
|
class iterparse:
|
|
|
|
root = None
|
|
|
|
|
|
|
|
def __init__(self, file, events=None):
|
|
|
|
self._close_file = False
|
|
|
|
if not hasattr(file, 'read'):
|
|
|
|
file = open(file, 'rb')
|
|
|
|
self._close_file = True
|
|
|
|
self._file = file
|
|
|
|
self._events = []
|
|
|
|
self._index = 0
|
|
|
|
self._error = None
|
|
|
|
self.root = self._root = None
|
|
|
|
b = TreeBuilder()
|
|
|
|
self._parser = XMLParser(b)
|
|
|
|
self._parser._setevents(self._events, events)
|
|
|
|
|
|
|
|
def __next__(self):
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
item = self._events[self._index]
|
|
|
|
self._index += 1
|
|
|
|
return item
|
|
|
|
except IndexError:
|
|
|
|
pass
|
|
|
|
if self._error:
|
|
|
|
e = self._error
|
|
|
|
self._error = None
|
|
|
|
raise e
|
|
|
|
if self._parser is None:
|
|
|
|
self.root = self._root
|
|
|
|
if self._close_file:
|
|
|
|
self._file.close()
|
|
|
|
raise StopIteration
|
|
|
|
# load event buffer
|
|
|
|
del self._events[:]
|
|
|
|
self._index = 0
|
|
|
|
data = self._file.read(16384)
|
|
|
|
if data:
|
|
|
|
try:
|
|
|
|
self._parser.feed(data)
|
|
|
|
except SyntaxError as exc:
|
|
|
|
self._error = exc
|
|
|
|
else:
|
|
|
|
self._root = self._parser.close()
|
|
|
|
self._parser = None
|
|
|
|
|
|
|
|
def __iter__(self):
|
|
|
|
return self
|
|
|
|
|
|
|
|
|
|
|
|
# =============================================================================
|
|
|
|
#
|
|
|
|
# Everything below this line can be removed
|
|
|
|
# after cElementTree is folded behind ElementTree.
|
|
|
|
#
|
|
|
|
# =============================================================================
|
|
|
|
|
|
|
|
from xml.etree.ElementTree import Comment as _Comment, PI as _PI
|
|
|
|
|
|
|
|
|
|
|
|
def parse(source, parser=None):
|
|
|
|
tree = ElementTree()
|
|
|
|
tree.parse(source, parser)
|
|
|
|
return tree
|
|
|
|
|
|
|
|
|
|
|
|
def XML(text, parser=None):
|
|
|
|
if not parser:
|
|
|
|
parser = XMLParser()
|
|
|
|
parser = XMLParser()
|
|
|
|
parser.feed(text)
|
|
|
|
return parser.close()
|
|
|
|
|
|
|
|
|
|
|
|
def XMLID(text, parser=None):
|
|
|
|
tree = XML(text, parser=parser)
|
|
|
|
ids = {}
|
|
|
|
for elem in tree.iter():
|
|
|
|
id = elem.get('id')
|
|
|
|
if id:
|
|
|
|
ids[id] = elem
|
|
|
|
return tree, ids
|
|
|
|
|
|
|
|
|
|
|
|
class CommentProxy:
|
|
|
|
|
|
|
|
def __call__(self, text=None):
|
|
|
|
element = Element(_Comment)
|
|
|
|
element.text = text
|
|
|
|
return element
|
|
|
|
|
|
|
|
def __eq__(self, other):
|
|
|
|
return _Comment == other
|
|
|
|
|
|
|
|
|
|
|
|
class PIProxy:
|
|
|
|
|
|
|
|
def __call__(self, target, text=None):
|
|
|
|
element = Element(_PI)
|
|
|
|
element.text = target
|
|
|
|
if text:
|
|
|
|
element.text = element.text + ' ' + text
|
|
|
|
return element
|
|
|
|
|
|
|
|
def __eq__(self, other):
|
|
|
|
return _PI == other
|
|
|
|
|
|
|
|
|
|
|
|
Comment = CommentProxy()
|
|
|
|
PI = ProcessingInstruction = PIProxy()
|
|
|
|
del CommentProxy, PIProxy
|
|
|
|
|
|
|
|
# Aliases
|
|
|
|
fromstring = XML
|
|
|
|
XMLTreeBuilder = XMLParser
|