blob: aaef59e519fdee56d9187b4ba02b242c384655f1 [file] [log] [blame]
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001# Wrapper module for _elementtree
2
Florent Xiclunaf4bdf4e2012-02-11 11:28:16 +01003from xml.etree.ElementTree import (ElementTree, dump, iselement, QName,
4 fromstringlist,
5 tostring, tostringlist, VERSION)
6# These ones are not in ElementTree.__all__
7from xml.etree.ElementTree import ElementPath, register_namespace
8
9# Import the C accelerators:
10# Element, SubElement, TreeBuilder, XMLParser, ParseError
Fredrik Lundh4c86ec62005-12-14 18:46:16 +000011from _elementtree import *
Florent Xiclunaf4bdf4e2012-02-11 11:28:16 +010012
13
14class ElementTree(ElementTree):
15
16 def parse(self, source, parser=None):
17 close_source = False
18 if not hasattr(source, 'read'):
19 source = open(source, 'rb')
20 close_source = True
21 try:
22 if parser is not None:
23 while True:
24 data = source.read(65536)
25 if not data:
26 break
27 parser.feed(data)
28 self._root = parser.close()
29 else:
30 parser = XMLParser()
31 self._root = parser._parse(source)
32 return self._root
33 finally:
34 if close_source:
35 source.close()
36
37
38class iterparse:
39 root = None
40
41 def __init__(self, file, events=None):
42 self._close_file = False
43 if not hasattr(file, 'read'):
44 file = open(file, 'rb')
45 self._close_file = True
46 self._file = file
47 self._events = []
48 self._index = 0
49 self._error = None
50 self.root = self._root = None
51 b = TreeBuilder()
52 self._parser = XMLParser(b)
53 self._parser._setevents(self._events, events)
54
55 def __next__(self):
56 while True:
57 try:
58 item = self._events[self._index]
59 self._index += 1
60 return item
61 except IndexError:
62 pass
63 if self._error:
64 e = self._error
65 self._error = None
66 raise e
67 if self._parser is None:
68 self.root = self._root
69 if self._close_file:
70 self._file.close()
71 raise StopIteration
72 # load event buffer
73 del self._events[:]
74 self._index = 0
75 data = self._file.read(16384)
76 if data:
77 try:
78 self._parser.feed(data)
79 except SyntaxError as exc:
80 self._error = exc
81 else:
82 self._root = self._parser.close()
83 self._parser = None
84
85 def __iter__(self):
86 return self
87
88
89# =============================================================================
90#
91# Everything below this line can be removed
92# after cElementTree is folded behind ElementTree.
93#
94# =============================================================================
95
96from xml.etree.ElementTree import Comment as _Comment, PI as _PI
97
98
99def parse(source, parser=None):
100 tree = ElementTree()
101 tree.parse(source, parser)
102 return tree
103
104
105def XML(text, parser=None):
106 if not parser:
107 parser = XMLParser()
108 parser = XMLParser()
109 parser.feed(text)
110 return parser.close()
111
112
113def XMLID(text, parser=None):
114 tree = XML(text, parser=parser)
115 ids = {}
116 for elem in tree.iter():
117 id = elem.get('id')
118 if id:
119 ids[id] = elem
120 return tree, ids
121
122
123class CommentProxy:
124
125 def __call__(self, text=None):
126 element = Element(_Comment)
127 element.text = text
128 return element
129
130 def __eq__(self, other):
131 return _Comment == other
132
133
134class PIProxy:
135
136 def __call__(self, target, text=None):
137 element = Element(_PI)
138 element.text = target
139 if text:
140 element.text = element.text + ' ' + text
141 return element
142
143 def __eq__(self, other):
144 return _PI == other
145
146
147Comment = CommentProxy()
148PI = ProcessingInstruction = PIProxy()
149del CommentProxy, PIProxy
150
151# Aliases
152fromstring = XML
153XMLTreeBuilder = XMLParser