Mercurial > cpython-lru_cache-weakref
annotate Lib/test/test_xml_etree.py @ 54294:dba767bc3155 legacy-trunk
remove mention of old ctypes version
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Sat, 23 May 2009 20:59:09 +0000 |
| parents | 1d84bf5f9478 |
| children | ff040880d1be |
| rev | line source |
|---|---|
| 39275 | 1 # xml.etree test. This file contains enough tests to make sure that |
| 36025 | 2 # all included components work as they should. For a more extensive |
| 3 # test suite, see the selftest script in the ElementTree distribution. | |
| 4 | |
|
45468
1d84bf5f9478
Patch #2167 from calvin: Remove unused imports
Christian Heimes <christian@cheimes.de>
parents:
39277
diff
changeset
|
5 import doctest |
|
1d84bf5f9478
Patch #2167 from calvin: Remove unused imports
Christian Heimes <christian@cheimes.de>
parents:
39277
diff
changeset
|
6 import sys |
| 36025 | 7 |
| 8 from test import test_support | |
| 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 | |
| 39275 | 34 >>> from xml.etree import ElementTree |
| 35 >>> from xml.etree import ElementInclude | |
| 36 >>> from xml.etree import ElementPath | |
| 36025 | 37 """ |
| 38 | |
| 39 def check_method(method): | |
| 40 if not callable(method): | |
| 41 print method, "not callable" | |
| 42 | |
| 43 def serialize(ET, elem, encoding=None): | |
| 44 import StringIO | |
| 45 file = StringIO.StringIO() | |
| 46 tree = ET.ElementTree(elem) | |
| 47 if encoding: | |
| 48 tree.write(file, encoding) | |
| 49 else: | |
| 50 tree.write(file) | |
| 51 return file.getvalue() | |
| 52 | |
| 53 def summarize(elem): | |
| 54 return elem.tag | |
| 55 | |
| 56 def summarize_list(seq): | |
| 57 return map(summarize, seq) | |
| 58 | |
| 59 def interface(): | |
| 60 """ | |
| 61 Test element tree interface. | |
| 62 | |
| 39275 | 63 >>> from xml.etree import ElementTree as ET |
| 64 | |
| 36025 | 65 >>> element = ET.Element("tag", key="value") |
| 66 >>> tree = ET.ElementTree(element) | |
| 67 | |
| 68 Make sure all standard element methods exist. | |
| 69 | |
| 70 >>> check_method(element.append) | |
| 71 >>> check_method(element.insert) | |
| 72 >>> check_method(element.remove) | |
| 73 >>> check_method(element.getchildren) | |
| 74 >>> check_method(element.find) | |
| 75 >>> check_method(element.findall) | |
| 76 >>> check_method(element.findtext) | |
| 77 >>> check_method(element.clear) | |
| 78 >>> check_method(element.get) | |
| 79 >>> check_method(element.set) | |
| 80 >>> check_method(element.keys) | |
| 81 >>> check_method(element.items) | |
| 82 >>> check_method(element.getiterator) | |
| 83 | |
| 84 Basic method sanity checks. | |
| 85 | |
| 86 >>> serialize(ET, element) # 1 | |
| 87 '<tag key="value" />' | |
| 88 >>> subelement = ET.Element("subtag") | |
| 89 >>> element.append(subelement) | |
| 90 >>> serialize(ET, element) # 2 | |
| 91 '<tag key="value"><subtag /></tag>' | |
| 92 >>> element.insert(0, subelement) | |
| 93 >>> serialize(ET, element) # 3 | |
| 94 '<tag key="value"><subtag /><subtag /></tag>' | |
| 95 >>> element.remove(subelement) | |
| 96 >>> serialize(ET, element) # 4 | |
| 97 '<tag key="value"><subtag /></tag>' | |
| 98 >>> element.remove(subelement) | |
| 99 >>> serialize(ET, element) # 5 | |
| 100 '<tag key="value" />' | |
| 101 >>> element.remove(subelement) | |
| 102 Traceback (most recent call last): | |
| 103 ValueError: list.remove(x): x not in list | |
| 104 >>> serialize(ET, element) # 6 | |
| 105 '<tag key="value" />' | |
| 106 """ | |
| 107 | |
| 108 def find(): | |
| 109 """ | |
| 110 Test find methods (including xpath syntax). | |
| 111 | |
| 39275 | 112 >>> from xml.etree import ElementTree as ET |
| 113 | |
| 36025 | 114 >>> elem = ET.XML(SAMPLE_XML) |
| 115 >>> elem.find("tag").tag | |
| 116 'tag' | |
| 117 >>> ET.ElementTree(elem).find("tag").tag | |
| 118 'tag' | |
| 119 >>> elem.find("section/tag").tag | |
| 120 'tag' | |
| 121 >>> ET.ElementTree(elem).find("section/tag").tag | |
| 122 'tag' | |
| 123 >>> elem.findtext("tag") | |
| 124 'text' | |
| 125 >>> elem.findtext("tog") | |
| 126 >>> elem.findtext("tog", "default") | |
| 127 'default' | |
| 128 >>> ET.ElementTree(elem).findtext("tag") | |
| 129 'text' | |
| 130 >>> elem.findtext("section/tag") | |
| 131 'subtext' | |
| 132 >>> ET.ElementTree(elem).findtext("section/tag") | |
| 133 'subtext' | |
| 134 >>> summarize_list(elem.findall("tag")) | |
| 135 ['tag', 'tag'] | |
| 136 >>> summarize_list(elem.findall("*")) | |
| 137 ['tag', 'tag', 'section'] | |
| 138 >>> summarize_list(elem.findall(".//tag")) | |
| 139 ['tag', 'tag', 'tag'] | |
| 140 >>> summarize_list(elem.findall("section/tag")) | |
| 141 ['tag'] | |
| 142 >>> summarize_list(elem.findall("section//tag")) | |
| 143 ['tag'] | |
| 144 >>> summarize_list(elem.findall("section/*")) | |
| 145 ['tag'] | |
| 146 >>> summarize_list(elem.findall("section//*")) | |
| 147 ['tag'] | |
| 148 >>> summarize_list(elem.findall("section/.//*")) | |
| 149 ['tag'] | |
| 150 >>> summarize_list(elem.findall("*/*")) | |
| 151 ['tag'] | |
| 152 >>> summarize_list(elem.findall("*//*")) | |
| 153 ['tag'] | |
| 154 >>> summarize_list(elem.findall("*/tag")) | |
| 155 ['tag'] | |
| 156 >>> summarize_list(elem.findall("*/./tag")) | |
| 157 ['tag'] | |
| 158 >>> summarize_list(elem.findall("./tag")) | |
| 159 ['tag', 'tag'] | |
| 160 >>> summarize_list(elem.findall(".//tag")) | |
| 161 ['tag', 'tag', 'tag'] | |
| 162 >>> summarize_list(elem.findall("././tag")) | |
| 163 ['tag', 'tag'] | |
| 164 >>> summarize_list(ET.ElementTree(elem).findall("/tag")) | |
| 165 ['tag', 'tag'] | |
| 166 >>> summarize_list(ET.ElementTree(elem).findall("./tag")) | |
| 167 ['tag', 'tag'] | |
| 168 >>> elem = ET.XML(SAMPLE_XML_NS) | |
| 169 >>> summarize_list(elem.findall("tag")) | |
| 170 [] | |
| 171 >>> summarize_list(elem.findall("{http://effbot.org/ns}tag")) | |
| 172 ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] | |
| 173 >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag")) | |
| 174 ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] | |
| 175 """ | |
| 176 | |
| 177 def parseliteral(): | |
| 178 r""" | |
| 179 | |
| 39275 | 180 >>> from xml.etree import ElementTree as ET |
| 181 | |
| 36025 | 182 >>> element = ET.XML("<html><body>text</body></html>") |
| 183 >>> ET.ElementTree(element).write(sys.stdout) | |
| 184 <html><body>text</body></html> | |
| 185 >>> element = ET.fromstring("<html><body>text</body></html>") | |
| 186 >>> ET.ElementTree(element).write(sys.stdout) | |
| 187 <html><body>text</body></html> | |
| 188 >>> print ET.tostring(element) | |
| 189 <html><body>text</body></html> | |
| 190 >>> print ET.tostring(element, "ascii") | |
| 191 <?xml version='1.0' encoding='ascii'?> | |
| 192 <html><body>text</body></html> | |
| 193 >>> _, ids = ET.XMLID("<html><body>text</body></html>") | |
| 194 >>> len(ids) | |
| 195 0 | |
| 196 >>> _, ids = ET.XMLID("<html><body id='body'>text</body></html>") | |
| 197 >>> len(ids) | |
| 198 1 | |
| 199 >>> ids["body"].tag | |
| 200 'body' | |
| 201 """ | |
| 202 | |
|
39277
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
203 |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
204 def check_encoding(ET, encoding): |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
205 """ |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
206 >>> from xml.etree import ElementTree as ET |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
207 |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
208 >>> check_encoding(ET, "ascii") |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
209 >>> check_encoding(ET, "us-ascii") |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
210 >>> check_encoding(ET, "iso-8859-1") |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
211 >>> check_encoding(ET, "iso-8859-15") |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
212 >>> check_encoding(ET, "cp437") |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
213 >>> check_encoding(ET, "mac-roman") |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
214 """ |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
215 ET.XML("<?xml version='1.0' encoding='%s'?><xml />" % encoding) |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
216 |
|
3a2d3eda3e16
restore test un-intentionally removed in the xmlcore purge (revision 50941)
Fred Drake <fdrake@acm.org>
parents:
39275
diff
changeset
|
217 |
| 36025 | 218 # |
| 219 # xinclude tests (samples from appendix C of the xinclude specification) | |
| 220 | |
| 221 XINCLUDE = {} | |
| 222 | |
| 223 XINCLUDE["C1.xml"] = """\ | |
| 224 <?xml version='1.0'?> | |
| 225 <document xmlns:xi="http://www.w3.org/2001/XInclude"> | |
| 226 <p>120 Mz is adequate for an average home user.</p> | |
| 227 <xi:include href="disclaimer.xml"/> | |
| 228 </document> | |
| 229 """ | |
| 230 | |
| 231 XINCLUDE["disclaimer.xml"] = """\ | |
| 232 <?xml version='1.0'?> | |
| 233 <disclaimer> | |
| 234 <p>The opinions represented herein represent those of the individual | |
| 235 and should not be interpreted as official policy endorsed by this | |
| 236 organization.</p> | |
| 237 </disclaimer> | |
| 238 """ | |
| 239 | |
| 240 XINCLUDE["C2.xml"] = """\ | |
| 241 <?xml version='1.0'?> | |
| 242 <document xmlns:xi="http://www.w3.org/2001/XInclude"> | |
| 243 <p>This document has been accessed | |
| 244 <xi:include href="count.txt" parse="text"/> times.</p> | |
| 245 </document> | |
| 246 """ | |
| 247 | |
| 248 XINCLUDE["count.txt"] = "324387" | |
| 249 | |
| 250 XINCLUDE["C3.xml"] = """\ | |
| 251 <?xml version='1.0'?> | |
| 252 <document xmlns:xi="http://www.w3.org/2001/XInclude"> | |
| 253 <p>The following is the source of the "data.xml" resource:</p> | |
| 254 <example><xi:include href="data.xml" parse="text"/></example> | |
| 255 </document> | |
| 256 """ | |
| 257 | |
| 258 XINCLUDE["data.xml"] = """\ | |
| 259 <?xml version='1.0'?> | |
| 260 <data> | |
| 261 <item><![CDATA[Brooks & Shields]]></item> | |
| 262 </data> | |
| 263 """ | |
| 264 | |
| 265 XINCLUDE["C5.xml"] = """\ | |
| 266 <?xml version='1.0'?> | |
| 267 <div xmlns:xi="http://www.w3.org/2001/XInclude"> | |
| 268 <xi:include href="example.txt" parse="text"> | |
| 269 <xi:fallback> | |
| 270 <xi:include href="fallback-example.txt" parse="text"> | |
| 271 <xi:fallback><a href="mailto:bob@example.org">Report error</a></xi:fallback> | |
| 272 </xi:include> | |
| 273 </xi:fallback> | |
| 274 </xi:include> | |
| 275 </div> | |
| 276 """ | |
| 277 | |
| 278 XINCLUDE["default.xml"] = """\ | |
| 279 <?xml version='1.0'?> | |
| 280 <document xmlns:xi="http://www.w3.org/2001/XInclude"> | |
| 281 <p>Example.</p> | |
| 282 <xi:include href="samples/simple.xml"/> | |
| 283 </document> | |
| 284 """ | |
| 285 | |
| 286 def xinclude_loader(href, parse="xml", encoding=None): | |
| 287 try: | |
| 288 data = XINCLUDE[href] | |
| 289 except KeyError: | |
| 290 raise IOError("resource not found") | |
| 291 if parse == "xml": | |
| 39275 | 292 from xml.etree.ElementTree import XML |
| 293 return XML(data) | |
| 36025 | 294 return data |
| 295 | |
| 296 def xinclude(): | |
| 297 r""" | |
| 298 Basic inclusion example (XInclude C.1) | |
| 299 | |
| 39275 | 300 >>> from xml.etree import ElementTree as ET |
| 301 >>> from xml.etree import ElementInclude | |
| 36025 | 302 |
| 303 >>> document = xinclude_loader("C1.xml") | |
| 304 >>> ElementInclude.include(document, xinclude_loader) | |
| 305 >>> print serialize(ET, document) # C1 | |
| 306 <document> | |
| 307 <p>120 Mz is adequate for an average home user.</p> | |
| 308 <disclaimer> | |
| 309 <p>The opinions represented herein represent those of the individual | |
| 310 and should not be interpreted as official policy endorsed by this | |
| 311 organization.</p> | |
| 312 </disclaimer> | |
| 313 </document> | |
| 314 | |
| 315 Textual inclusion example (XInclude C.2) | |
| 316 | |
| 317 >>> document = xinclude_loader("C2.xml") | |
| 318 >>> ElementInclude.include(document, xinclude_loader) | |
| 319 >>> print serialize(ET, document) # C2 | |
| 320 <document> | |
| 321 <p>This document has been accessed | |
| 322 324387 times.</p> | |
| 323 </document> | |
| 324 | |
| 325 Textual inclusion of XML example (XInclude C.3) | |
| 326 | |
| 327 >>> document = xinclude_loader("C3.xml") | |
| 328 >>> ElementInclude.include(document, xinclude_loader) | |
| 329 >>> print serialize(ET, document) # C3 | |
| 330 <document> | |
| 331 <p>The following is the source of the "data.xml" resource:</p> | |
| 332 <example><?xml version='1.0'?> | |
| 333 <data> | |
| 334 <item><![CDATA[Brooks & Shields]]></item> | |
| 335 </data> | |
| 336 </example> | |
| 337 </document> | |
| 338 | |
| 339 Fallback example (XInclude C.5) | |
| 340 Note! Fallback support is not yet implemented | |
| 341 | |
| 342 >>> document = xinclude_loader("C5.xml") | |
| 343 >>> ElementInclude.include(document, xinclude_loader) | |
| 344 Traceback (most recent call last): | |
| 345 IOError: resource not found | |
| 346 >>> # print serialize(ET, document) # C5 | |
| 347 | |
| 348 """ | |
| 349 | |
| 350 def test_main(): | |
| 351 from test import test_xml_etree | |
| 352 test_support.run_doctest(test_xml_etree, verbosity=True) | |
| 353 | |
| 354 if __name__ == '__main__': | |
| 355 test_main() |
