3 import xml.etree.cElementTree as etree
5 import xml.etree.ElementTree as etree
7 from xml.etree.ElementTree import ParseError
9 from .errors import MalformedXML
13 return tag[tag.find("}") + 1:]
17 def __init__(self, etree_events):
19 self.etree_events = etree_events
22 event, element = next(self.etree_events)
24 tag = trim_ns(element.tag)
27 self.tag_stack.append(tag)
29 if self.tag_stack[-1] == tag:
32 raise MalformedXML("Expected {0}, but saw {1}.".format(
40 return len(self.tag_stack)
43 def from_file(cls, f):
44 return EventPointer(etree.iterparse(f, events=("start", "end")))
47 class ElementIterator:
48 def __init__(self, element, pointer):
49 self.pointer = pointer
50 self.element = element
51 self.depth = pointer.depth() - 1
57 while not self.done and self.pointer.depth() > self.depth:
58 event, element = next(self.pointer)
61 sub_iterator = ElementIterator(element, self.pointer)
71 while not self.done and self.pointer.depth() > self.depth:
72 event, element = next(self.pointer)
73 if self.pointer.depth() > self.depth:
82 def attr(self, key, alt=None):
83 return self.element.attrib.get(key, alt)
85 def __getattr__(self, attr):
87 return trim_ns(self.element.tag)
90 return self.element.text
92 raise AttributeError("%s has no attribute %r" % (self.__class__.__name__, attr))
95 def from_file(cls, f):
98 pointer = EventPointer.from_file(f)
99 event, element = next(pointer)
100 return cls(element, pointer)
101 except ParseError as e:
103 "{0}: {1}...".format(str(e),
104 str(f.read(500), 'utf-8', 'replace')))