|
1 # xml.etree test for cElementTree |
|
2 |
|
3 import doctest |
|
4 import sys |
|
5 |
|
6 from test import test_support |
|
7 |
|
8 from xml.etree import cElementTree as ET |
|
9 |
|
10 SAMPLE_XML = """ |
|
11 <body> |
|
12 <tag>text</tag> |
|
13 <tag /> |
|
14 <section> |
|
15 <tag>subtext</tag> |
|
16 </section> |
|
17 </body> |
|
18 """ |
|
19 |
|
20 SAMPLE_XML_NS = """ |
|
21 <body xmlns="http://effbot.org/ns"> |
|
22 <tag>text</tag> |
|
23 <tag /> |
|
24 <section> |
|
25 <tag>subtext</tag> |
|
26 </section> |
|
27 </body> |
|
28 """ |
|
29 |
|
30 def sanity(): |
|
31 """ |
|
32 Import sanity. |
|
33 |
|
34 >>> from xml.etree import cElementTree |
|
35 """ |
|
36 |
|
37 def check_method(method): |
|
38 if not callable(method): |
|
39 print method, "not callable" |
|
40 |
|
41 def serialize(ET, elem, encoding=None): |
|
42 import StringIO |
|
43 file = StringIO.StringIO() |
|
44 tree = ET.ElementTree(elem) |
|
45 if encoding: |
|
46 tree.write(file, encoding) |
|
47 else: |
|
48 tree.write(file) |
|
49 return file.getvalue() |
|
50 |
|
51 def summarize(elem): |
|
52 return elem.tag |
|
53 |
|
54 def summarize_list(seq): |
|
55 return map(summarize, seq) |
|
56 |
|
57 def interface(): |
|
58 """ |
|
59 Test element tree interface. |
|
60 |
|
61 >>> element = ET.Element("tag", key="value") |
|
62 >>> tree = ET.ElementTree(element) |
|
63 |
|
64 Make sure all standard element methods exist. |
|
65 |
|
66 >>> check_method(element.append) |
|
67 >>> check_method(element.insert) |
|
68 >>> check_method(element.remove) |
|
69 >>> check_method(element.getchildren) |
|
70 >>> check_method(element.find) |
|
71 >>> check_method(element.findall) |
|
72 >>> check_method(element.findtext) |
|
73 >>> check_method(element.clear) |
|
74 >>> check_method(element.get) |
|
75 >>> check_method(element.set) |
|
76 >>> check_method(element.keys) |
|
77 >>> check_method(element.items) |
|
78 >>> check_method(element.getiterator) |
|
79 |
|
80 Basic method sanity checks. |
|
81 |
|
82 >>> serialize(ET, element) # 1 |
|
83 '<tag key="value" />' |
|
84 >>> subelement = ET.Element("subtag") |
|
85 >>> element.append(subelement) |
|
86 >>> serialize(ET, element) # 2 |
|
87 '<tag key="value"><subtag /></tag>' |
|
88 >>> element.insert(0, subelement) |
|
89 >>> serialize(ET, element) # 3 |
|
90 '<tag key="value"><subtag /><subtag /></tag>' |
|
91 >>> element.remove(subelement) |
|
92 >>> serialize(ET, element) # 4 |
|
93 '<tag key="value"><subtag /></tag>' |
|
94 >>> element.remove(subelement) |
|
95 >>> serialize(ET, element) # 5 |
|
96 '<tag key="value" />' |
|
97 >>> element.remove(subelement) |
|
98 Traceback (most recent call last): |
|
99 ValueError: list.remove(x): x not in list |
|
100 >>> serialize(ET, element) # 6 |
|
101 '<tag key="value" />' |
|
102 """ |
|
103 |
|
104 def find(): |
|
105 """ |
|
106 Test find methods (including xpath syntax). |
|
107 |
|
108 >>> elem = ET.XML(SAMPLE_XML) |
|
109 >>> elem.find("tag").tag |
|
110 'tag' |
|
111 >>> ET.ElementTree(elem).find("tag").tag |
|
112 'tag' |
|
113 >>> elem.find("section/tag").tag |
|
114 'tag' |
|
115 >>> ET.ElementTree(elem).find("section/tag").tag |
|
116 'tag' |
|
117 >>> elem.findtext("tag") |
|
118 'text' |
|
119 >>> elem.findtext("tog") |
|
120 >>> elem.findtext("tog", "default") |
|
121 'default' |
|
122 >>> ET.ElementTree(elem).findtext("tag") |
|
123 'text' |
|
124 >>> elem.findtext("section/tag") |
|
125 'subtext' |
|
126 >>> ET.ElementTree(elem).findtext("section/tag") |
|
127 'subtext' |
|
128 >>> summarize_list(elem.findall("tag")) |
|
129 ['tag', 'tag'] |
|
130 >>> summarize_list(elem.findall("*")) |
|
131 ['tag', 'tag', 'section'] |
|
132 >>> summarize_list(elem.findall(".//tag")) |
|
133 ['tag', 'tag', 'tag'] |
|
134 >>> summarize_list(elem.findall("section/tag")) |
|
135 ['tag'] |
|
136 >>> summarize_list(elem.findall("section//tag")) |
|
137 ['tag'] |
|
138 >>> summarize_list(elem.findall("section/*")) |
|
139 ['tag'] |
|
140 >>> summarize_list(elem.findall("section//*")) |
|
141 ['tag'] |
|
142 >>> summarize_list(elem.findall("section/.//*")) |
|
143 ['tag'] |
|
144 >>> summarize_list(elem.findall("*/*")) |
|
145 ['tag'] |
|
146 >>> summarize_list(elem.findall("*//*")) |
|
147 ['tag'] |
|
148 >>> summarize_list(elem.findall("*/tag")) |
|
149 ['tag'] |
|
150 >>> summarize_list(elem.findall("*/./tag")) |
|
151 ['tag'] |
|
152 >>> summarize_list(elem.findall("./tag")) |
|
153 ['tag', 'tag'] |
|
154 >>> summarize_list(elem.findall(".//tag")) |
|
155 ['tag', 'tag', 'tag'] |
|
156 >>> summarize_list(elem.findall("././tag")) |
|
157 ['tag', 'tag'] |
|
158 >>> summarize_list(ET.ElementTree(elem).findall("/tag")) |
|
159 ['tag', 'tag'] |
|
160 >>> summarize_list(ET.ElementTree(elem).findall("./tag")) |
|
161 ['tag', 'tag'] |
|
162 >>> elem = ET.XML(SAMPLE_XML_NS) |
|
163 >>> summarize_list(elem.findall("tag")) |
|
164 [] |
|
165 >>> summarize_list(elem.findall("{http://effbot.org/ns}tag")) |
|
166 ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] |
|
167 >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag")) |
|
168 ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] |
|
169 """ |
|
170 |
|
171 def parseliteral(): |
|
172 r""" |
|
173 |
|
174 >>> element = ET.XML("<html><body>text</body></html>") |
|
175 >>> ET.ElementTree(element).write(sys.stdout) |
|
176 <html><body>text</body></html> |
|
177 >>> element = ET.fromstring("<html><body>text</body></html>") |
|
178 >>> ET.ElementTree(element).write(sys.stdout) |
|
179 <html><body>text</body></html> |
|
180 >>> print ET.tostring(element) |
|
181 <html><body>text</body></html> |
|
182 >>> print ET.tostring(element, "ascii") |
|
183 <?xml version='1.0' encoding='ascii'?> |
|
184 <html><body>text</body></html> |
|
185 >>> _, ids = ET.XMLID("<html><body>text</body></html>") |
|
186 >>> len(ids) |
|
187 0 |
|
188 >>> _, ids = ET.XMLID("<html><body id='body'>text</body></html>") |
|
189 >>> len(ids) |
|
190 1 |
|
191 >>> ids["body"].tag |
|
192 'body' |
|
193 """ |
|
194 |
|
195 def check_encoding(encoding): |
|
196 """ |
|
197 >>> check_encoding("ascii") |
|
198 >>> check_encoding("us-ascii") |
|
199 >>> check_encoding("iso-8859-1") |
|
200 >>> check_encoding("iso-8859-15") |
|
201 >>> check_encoding("cp437") |
|
202 >>> check_encoding("mac-roman") |
|
203 """ |
|
204 ET.XML( |
|
205 "<?xml version='1.0' encoding='%s'?><xml />" % encoding |
|
206 ) |
|
207 |
|
208 def bug_1534630(): |
|
209 """ |
|
210 >>> bob = ET.TreeBuilder() |
|
211 >>> e = bob.data("data") |
|
212 >>> e = bob.start("tag", {}) |
|
213 >>> e = bob.end("tag") |
|
214 >>> e = bob.close() |
|
215 >>> serialize(ET, e) |
|
216 '<tag />' |
|
217 """ |
|
218 |
|
219 def test_main(): |
|
220 from test import test_xml_etree_c |
|
221 test_support.run_doctest(test_xml_etree_c, verbosity=True) |
|
222 |
|
223 if __name__ == '__main__': |
|
224 test_main() |