| # Wrapper module for _elementtree |
| |
| 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 |
| from _elementtree import * |
| |
| |
| 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 |