| Home | Trees | Indices | Help |
|
|---|
|
|
1 # -*- coding: utf-8 -*-
2
3 """
4 Tests for the ElementTree API
5
6 Only test cases that apply equally well to etree and ElementTree
7 belong here. Note that there is a second test module called test_io.py
8 for IO related test cases.
9 """
10
11 import unittest, doctest
12 import os, re, tempfile, copy, operator, gc
13
14 from common_imports import StringIO, etree, ElementTree, cElementTree
15 from common_imports import fileInTestDir, canonicalize
16
17 if cElementTree is not None:
18 if tuple([int(n) for n in
19 getattr(cElementTree, "VERSION", "0.0").split(".")]) <= (1,0,6):
20 cElementTree = None
21
23 etree = None
24
27
29 for i in range(10):
30 e = self.etree.Element('foo')
31 self.assertEquals(e.tag, 'foo')
32 self.assertEquals(e.text, None)
33 self.assertEquals(e.tail, None)
34
36 Element = self.etree.Element
37
38 root = Element('root')
39 root.append(Element('one'))
40 root.append(Element('two'))
41 root.append(Element('three'))
42 self.assertEquals(3, len(root))
43 self.assertEquals('one', root[0].tag)
44 self.assertEquals('two', root[1].tag)
45 self.assertEquals('three', root[2].tag)
46 self.assertRaises(IndexError, operator.getitem, root, 3)
47
49 Element = self.etree.Element
50 SubElement = self.etree.SubElement
51
52 root = Element('root')
53 SubElement(root, 'one')
54 SubElement(root, 'two')
55 SubElement(root, 'three')
56 self.assertEquals(3, len(root))
57 self.assertEquals('one', root[0].tag)
58 self.assertEquals('two', root[1].tag)
59 self.assertEquals('three', root[2].tag)
60
62 Element = self.etree.Element
63 SubElement = self.etree.SubElement
64
65 root1 = Element('root')
66 SubElement(root1, 'one')
67 self.assert_(root1[0] in root1)
68
69 root2 = Element('root')
70 SubElement(root2, 'two')
71 SubElement(root2, 'three')
72 self.assert_(root2[0] in root2)
73 self.assert_(root2[1] in root2)
74
75 self.assertFalse(root1[0] in root2)
76 self.assertFalse(root2[0] in root1)
77 self.assertFalse(None in root2)
78
80 ElementTree = self.etree.ElementTree
81
82 f = StringIO('<doc>Test<one>One</one></doc>')
83 doc = ElementTree(file=f)
84 root = doc.getroot()
85 self.assertEquals(1, len(root))
86 self.assertEquals('one', root[0].tag)
87 self.assertRaises(IndexError, operator.getitem, root, 1)
88
90 ElementTree = self.etree.ElementTree
91
92 f = StringIO('<doc><one>One</one><two>Two</two>hm<three>Three</three></doc>')
93 doc = ElementTree(file=f)
94 root = doc.getroot()
95 self.assertEquals(3, len(root))
96 self.assertEquals('one', root[0].tag)
97 self.assertEquals('two', root[1].tag)
98 self.assertEquals('three', root[2].tag)
99
101 ElementTree = self.etree.ElementTree
102
103 f = StringIO('<doc>Test</doc>')
104 doc = ElementTree(file=f)
105 root = doc.getroot()
106 self.assertEquals(0, len(root))
107
109 Element = self.etree.Element
110 SubElement = self.etree.SubElement
111 a = Element('a')
112 b = SubElement(a, 'b')
113 c = SubElement(a, 'c')
114 d = SubElement(a, 'd')
115 self.assertEquals(d, a[-1])
116 self.assertEquals(c, a[-2])
117 self.assertEquals(b, a[-3])
118 self.assertRaises(IndexError, operator.getitem, a, -4)
119 a[-1] = e = Element('e')
120 self.assertEquals(e, a[-1])
121 del a[-1]
122 self.assertEquals(2, len(a))
123
125 ElementTree = self.etree.ElementTree
126
127 f = StringIO('<doc><one>One</one><two>Two</two></doc>')
128 doc = ElementTree(file=f)
129 root = doc.getroot()
130 self.assertEquals(2, len(root))
131 self.assertEquals('one', root[0].tag)
132 self.assertEquals('two', root[1].tag)
133
135 ElementTree = self.etree.ElementTree
136
137 f = StringIO('<doc>This is a text</doc>')
138 doc = ElementTree(file=f)
139 root = doc.getroot()
140 self.assertEquals('This is a text', root.text)
141
143 ElementTree = self.etree.ElementTree
144
145 f = StringIO('<doc></doc>')
146 doc = ElementTree(file=f)
147 root = doc.getroot()
148 self.assertEquals(None, root.text)
149
151 ElementTree = self.etree.ElementTree
152
153 f = StringIO('<doc><one>One</one></doc>')
154 doc = ElementTree(file=f)
155 root = doc.getroot()
156 self.assertEquals(None, root.text)
157 self.assertEquals('One', root[0].text)
158
160 ElementTree = self.etree.ElementTree
161
162 f = StringIO('<doc>This is > than a text</doc>')
163 doc = ElementTree(file=f)
164 root = doc.getroot()
165 self.assertEquals('This is > than a text', root.text)
166
168 Element = self.etree.Element
169
170 a = Element("a")
171 a.text = "<>&"
172 self.assertXML('<a><>&</a>',
173 a)
174
176 tostring = self.etree.tostring
177 Element = self.etree.Element
178
179 a = Element("a")
180 a.text = "<>&"
181 self.assertEquals('<a><>&</a>',
182 tostring(a))
183
189
190 a = Element("a")
191 a.text = strTest("text")
192 self.assertXML('<a>text</a>',
193 a)
194
196 ElementTree = self.etree.ElementTree
197
198 f = StringIO('<doc>This is <i>mixed</i> content.</doc>')
199 doc = ElementTree(file=f)
200 root = doc.getroot()
201 self.assertEquals(1, len(root))
202 self.assertEquals('This is ', root.text)
203 self.assertEquals(None, root.tail)
204 self.assertEquals('mixed', root[0].text)
205 self.assertEquals(' content.', root[0].tail)
206
208 Element = self.etree.Element
209 SubElement = self.etree.SubElement
210
211 class strTest(str):
212 pass
213
214 a = Element("a")
215 SubElement(a, "t").tail = strTest("tail")
216 self.assertXML('<a><t></t>tail</a>',
217 a)
218
220 Element = self.etree.Element
221 ElementTree = self.etree.ElementTree
222
223 el = Element('hoi')
224 doc = ElementTree(el)
225 root = doc.getroot()
226 self.assertEquals(None, root.text)
227 self.assertEquals('hoi', root.tag)
228
230 ElementTree = self.etree.ElementTree
231
232 f = StringIO('<doc one="One" two="Two"/>')
233 doc = ElementTree(file=f)
234 root = doc.getroot()
235 self.assertEquals('One', root.attrib['one'])
236 self.assertEquals('Two', root.attrib['two'])
237 self.assertRaises(KeyError, operator.getitem, root.attrib, 'three')
238
240 ElementTree = self.etree.ElementTree
241
242 f = StringIO('<doc one="One" two="Two"/>')
243 doc = ElementTree(file=f)
244 root = doc.getroot()
245 self.assertEquals('One', root.attrib.get('one'))
246 self.assertEquals('Two', root.attrib.get('two'))
247 self.assertEquals(None, root.attrib.get('three'))
248 self.assertEquals('foo', root.attrib.get('three', 'foo'))
249
251 ElementTree = self.etree.ElementTree
252
253 f = StringIO('<doc one="One" two="Two"/>')
254 doc = ElementTree(file=f)
255 root = doc.getroot()
256 self.assertEquals('One', root.get('one'))
257 self.assertEquals('Two', root.get('two'))
258 self.assertEquals(None, root.get('three'))
259 self.assertEquals('foo', root.get('three', 'foo'))
260
262 XML = self.etree.XML
263
264 root = XML('<doc one="One" two="Two"/>')
265 self.assertEquals('One', root.get('one'))
266 self.assertEquals('Two', root.get('two'))
267 root.attrib.clear()
268 self.assertEquals(None, root.get('one'))
269 self.assertEquals(None, root.get('two'))
270
272 Element = self.etree.Element
273
274 root = Element("root", one="One")
275 root.set("two", "Two")
276 self.assertEquals('One', root.get('one'))
277 self.assertEquals('Two', root.get('two'))
278 root.attrib.clear()
279 self.assertEquals(None, root.get('one'))
280 self.assertEquals(None, root.get('two'))
281
283 Element = self.etree.Element
284 SubElement = self.etree.SubElement
285
286 attribNS = '{http://foo/bar}x'
287
288 parent = Element('parent')
289 parent.set(attribNS, 'a')
290 child = SubElement(parent, 'child')
291 child.set(attribNS, 'b')
292
293 self.assertEquals('a', parent.get(attribNS))
294 self.assertEquals('b', child.get(attribNS))
295
296 parent.clear()
297 self.assertEquals(None, parent.get(attribNS))
298 self.assertEquals('b', child.get(attribNS))
299
301 XML = self.etree.XML
302
303 root = XML('<doc alpha="Alpha" beta="Beta"/>')
304 items = root.attrib.items()
305 items.sort()
306 self.assertEquals(
307 [('alpha', 'Alpha'), ('beta', 'Beta')],
308 items)
309
310 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'})
311
312 items = root.attrib.items()
313 items.sort()
314 self.assertEquals(
315 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')],
316 items)
317
319 XML = self.etree.XML
320
321 root = XML('<doc alpha="Alpha" beta="Beta"/>')
322 items = root.attrib.items()
323 items.sort()
324 self.assertEquals(
325 [('alpha', 'Alpha'), ('beta', 'Beta')],
326 items)
327
328 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.items())
329
330 items = root.attrib.items()
331 items.sort()
332 self.assertEquals(
333 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')],
334 items)
335
337 XML = self.etree.XML
338
339 root = XML('<doc alpha="Alpha" beta="Beta"/>')
340 items = root.attrib.items()
341 items.sort()
342 self.assertEquals(
343 [('alpha', 'Alpha'), ('beta', 'Beta')],
344 items)
345
346 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.iteritems())
347
348 items = root.attrib.items()
349 items.sort()
350 self.assertEquals(
351 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')],
352 items)
353
355 XML = self.etree.XML
356
357 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
358 keys = root.attrib.keys()
359 keys.sort()
360 self.assertEquals(['alpha', 'beta', 'gamma'], keys)
361
363 XML = self.etree.XML
364
365 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
366 keys = root.keys()
367 keys.sort()
368 self.assertEquals(['alpha', 'beta', 'gamma'], keys)
369
371 XML = self.etree.XML
372
373 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
374 items = root.items()
375 items.sort()
376 self.assertEquals(
377 [('alpha','Alpha'), ('beta','Beta'), ('gamma','Gamma')],
378 items)
379
381 XML = self.etree.XML
382
383 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
384 keys = root.keys()
385 keys.sort()
386 self.assertEquals(['bar', '{http://ns.codespeak.net/test}baz'],
387 keys)
388
390 XML = self.etree.XML
391
392 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
393 values = root.attrib.values()
394 values.sort()
395 self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)
396
398 XML = self.etree.XML
399
400 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
401 values = root.attrib.values()
402 values.sort()
403 self.assertEquals(
404 ['Bar', 'Baz'], values)
405
407 XML = self.etree.XML
408
409 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
410 items = root.attrib.items()
411 items.sort()
412 self.assertEquals([
413 ('alpha', 'Alpha'),
414 ('beta', 'Beta'),
415 ('gamma', 'Gamma'),
416 ],
417 items)
418
420 XML = self.etree.XML
421
422 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
423 items = root.attrib.items()
424 items.sort()
425 self.assertEquals(
426 [('bar', 'Bar'), ('{http://ns.codespeak.net/test}baz', 'Baz')],
427 items)
428
430 XML = self.etree.XML
431
432 expected = "{'{http://ns.codespeak.net/test}baz': 'Baz', 'bar': 'Bar'}"
433 alternative = "{'bar': 'Bar', '{http://ns.codespeak.net/test}baz': 'Baz'}"
434
435 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
436 try:
437 self.assertEquals(expected, str(root.attrib))
438 except AssertionError:
439 self.assertEquals(alternative, str(root.attrib))
440
442 XML = self.etree.XML
443
444 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
445 self.assertEquals(
446 True, root.attrib.has_key('bar'))
447 self.assertEquals(
448 False, root.attrib.has_key('baz'))
449 self.assertEquals(
450 False, root.attrib.has_key('hah'))
451 self.assertEquals(
452 True,
453 root.attrib.has_key('{http://ns.codespeak.net/test}baz'))
454
456 XML = self.etree.XML
457
458 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')
459 self.assertEquals(
460 True, 'bar' in root.attrib)
461 self.assertEquals(
462 False, 'baz' in root.attrib)
463 self.assertEquals(
464 False, 'hah' in root.attrib)
465 self.assertEquals(
466 True,
467 '{http://ns.codespeak.net/test}baz' in root.attrib)
468
470 Element = self.etree.Element
471
472 root = Element("root")
473 root.set("attr", "TEST")
474 self.assertEquals("TEST", root.get("attr"))
475
477 XML = self.etree.XML
478
479 root = XML('<doc>This is a text.</doc>')
480 self.assertEquals(0, len(root))
481 self.assertEquals('This is a text.', root.text)
482
484 XMLID = self.etree.XMLID
485 XML = self.etree.XML
486 xml_text = '''
487 <document>
488 <h1 id="chapter1">...</h1>
489 <p id="note1" class="note">...</p>
490 <p>Regular paragraph.</p>
491 <p xml:id="xmlid">XML:ID paragraph.</p>
492 <p id="warn1" class="warning">...</p>
493 </document>
494 '''
495
496 root, dic = XMLID(xml_text)
497 root2 = XML(xml_text)
498 self.assertEquals(self._writeElement(root),
499 self._writeElement(root2))
500 expected = {
501 "chapter1" : root[0],
502 "note1" : root[1],
503 "warn1" : root[4]
504 }
505 self.assertEquals(dic, expected)
506
508 fromstring = self.etree.fromstring
509
510 root = fromstring('<doc>This is a text.</doc>')
511 self.assertEquals(0, len(root))
512 self.assertEquals('This is a text.', root.text)
513
515 fromstringlist = self.etree.fromstringlist
516
517 root = fromstringlist(["<do", "c>T", "hi", "s is",
518 " a text.<", "/doc", ">"])
519 self.assertEquals(0, len(root))
520 self.assertEquals('This is a text.', root.text)
521
523 fromstringlist = self.etree.fromstringlist
524
525 root = fromstringlist(list('<doc>This is a text.</doc>'))
526 self.assertEquals(0, len(root))
527 self.assertEquals('This is a text.', root.text)
528
530 fromstringlist = self.etree.fromstringlist
531
532 root = fromstringlist(['<doc>This is a text.</doc>'])
533 self.assertEquals(0, len(root))
534 self.assertEquals('This is a text.', root.text)
535
537 iselement = self.etree.iselement
538 Element = self.etree.Element
539 ElementTree = self.etree.ElementTree
540 XML = self.etree.XML
541 Comment = self.etree.Comment
542 ProcessingInstruction = self.etree.ProcessingInstruction
543
544 el = Element('hoi')
545 self.assert_(iselement(el))
546
547 el2 = XML('<foo/>')
548 self.assert_(iselement(el2))
549
550 tree = ElementTree(element=Element('dag'))
551 self.assert_(not iselement(tree))
552 self.assert_(iselement(tree.getroot()))
553
554 c = Comment('test')
555 self.assert_(iselement(c))
556
557 p = ProcessingInstruction("test", "some text")
558 self.assert_(iselement(p))
559
561 XML = self.etree.XML
562
563 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
564 result = []
565 for el in root:
566 result.append(el.tag)
567 self.assertEquals(['one', 'two', 'three'], result)
568
570 XML = self.etree.XML
571
572 root = XML('<doc></doc>')
573 result = []
574 for el in root:
575 result.append(el.tag)
576 self.assertEquals([], result)
577
579 XML = self.etree.XML
580
581 root = XML('<doc>Text</doc>')
582 result = []
583 for el in root:
584 result.append(el.tag)
585 self.assertEquals([], result)
586
588 # this would cause a crash in the past
589 fromstring = self.etree.fromstring
590 root = etree.fromstring('<html><p></p>x</html>')
591 for elem in root:
592 elem.tail = ''
593
595 XML = self.etree.XML
596
597 try:
598 reversed(())
599 except NameError:
600 # before Python 2.4
601 return
602
603 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
604 result = []
605 for el in reversed(root):
606 result.append(el.tag)
607 self.assertEquals(['three', 'two', 'one'], result)
608
610 XML = self.etree.XML
611
612 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
613 result = []
614 add = True
615 for el in root:
616 result.append(el.tag)
617 if add:
618 self.etree.SubElement(root, 'four')
619 add = False
620 self.assertEquals(['one', 'two', 'three', 'four'], result)
621
623 XML = self.etree.XML
624
625 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
626 result = []
627 for el in root:
628 result.append(el.tag)
629 del root[-1]
630 self.assertEquals(['one', 'two'], result)
631
633 XML = self.etree.XML
634
635 root = XML('<doc><one/><two/></doc>')
636 result = []
637 for el0 in root:
638 result.append(el0.tag)
639 for el1 in root:
640 result.append(el1.tag)
641 self.assertEquals(['one','one', 'two', 'two', 'one', 'two'], result)
642
644 XML = self.etree.XML
645
646 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma" />')
647 result = []
648 for key in root.attrib:
649 result.append(key)
650 result.sort()
651 self.assertEquals(['alpha', 'beta', 'gamma'], result)
652
654 XML = self.etree.XML
655 root = XML('<a><b><c/></b><b/><c><b/></c></a>')
656 self.assertEquals(len(list(root.findall("c"))), 1)
657 self.assertEquals(len(list(root.findall(".//c"))), 2)
658 self.assertEquals(len(list(root.findall(".//b"))), 3)
659 self.assertEquals(len(list(root.findall(".//b"))[0]), 1)
660 self.assertEquals(len(list(root.findall(".//b"))[1]), 0)
661 self.assertEquals(len(list(root.findall(".//b"))[2]), 0)
662
664 XML = self.etree.XML
665 root = XML('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')
666 self.assertEquals(len(list(root.findall(".//{X}b"))), 2)
667 self.assertEquals(len(list(root.findall(".//b"))), 3)
668 self.assertEquals(len(list(root.findall("b"))), 2)
669
671 Element = self.etree.Element
672
673 el = Element('tag', foo='Foo', bar='Bar')
674 self.assertEquals('Foo', el.attrib['foo'])
675 self.assertEquals('Bar', el.attrib['bar'])
676
678 Element = self.etree.Element
679
680 el = Element('tag', {'foo':'Foo', 'bar':'Bar'})
681 self.assertEquals('Foo', el.attrib['foo'])
682 self.assertEquals('Bar', el.attrib['bar'])
683
685 Element = self.etree.Element
686
687 el = Element('tag', {'{ns1}foo':'Foo', '{ns2}bar':'Bar'})
688 self.assertEquals('Foo', el.attrib['{ns1}foo'])
689 self.assertEquals('Bar', el.attrib['{ns2}bar'])
690
692 Element = self.etree.Element
693 SubElement = self.etree.SubElement
694
695 el = Element('tag')
696 SubElement(el, 'foo', {'foo':'Foo'}, baz="Baz")
697 self.assertEquals("Baz", el[0].attrib['baz'])
698 self.assertEquals('Foo', el[0].attrib['foo'])
699
701 Element = self.etree.Element
702 SubElement = self.etree.SubElement
703
704 el = Element('tag')
705 SubElement(el, 'foo', {'{ns1}foo':'Foo', '{ns2}bar':'Bar'})
706 self.assertEquals('Foo', el[0].attrib['{ns1}foo'])
707 self.assertEquals('Bar', el[0].attrib['{ns2}bar'])
708
710 ElementTree = self.etree.ElementTree
711 XML = self.etree.XML
712
713 for i in range(10):
714 f = StringIO()
715 root = XML('<doc%s>This is a test.</doc%s>' % (i, i))
716 tree = ElementTree(element=root)
717 tree.write(f)
718 data = f.getvalue()
719 self.assertEquals(
720 '<doc%s>This is a test.</doc%s>' % (i, i),
721 canonicalize(data))
722
724 ElementTree = self.etree.ElementTree
725 Element = self.etree.Element
726 SubElement = self.etree.SubElement
727
728 html = Element('html')
729 body = SubElement(html, 'body')
730 p = SubElement(body, 'p')
731 p.text = "html"
732 SubElement(p, 'br').tail = "test"
733
734 tree = ElementTree(element=html)
735 f = StringIO()
736 tree.write(f, method="html")
737 data = f.getvalue()
738
739 self.assertEquals('<html><body><p>html<br>test</p></body></html>',
740 data)
741
743 ElementTree = self.etree.ElementTree
744 Element = self.etree.Element
745 SubElement = self.etree.SubElement
746
747 a = Element('a')
748 a.text = "A"
749 a.tail = "tail"
750 b = SubElement(a, 'b')
751 b.text = "B"
752 b.tail = "TAIL"
753 c = SubElement(a, 'c')
754 c.text = "C"
755
756 tree = ElementTree(element=a)
757 f = StringIO()
758 tree.write(f, method="text")
759 data = f.getvalue()
760
761 self.assertEquals('ABTAILCtail',
762 data)
763
765 ElementTree = self.etree.ElementTree
766 XML = self.etree.XML
767
768 tree = ElementTree( XML('<doc>This is a test.</doc>') )
769 self.assertRaises(IOError, tree.write,
770 "definitely////\\-\\nonexisting\\-\\////FILE")
771
772 # this could trigger a crash, apparently because the document
773 # reference was prematurely garbage collected
775 Element = self.etree.Element
776
777 element = Element('tag')
778 for i in range(10):
779 element.attrib['key'] = 'value'
780 value = element.attrib['key']
781 self.assertEquals(value, 'value')
782
783 # from doctest; for some reason this caused crashes too
785 Element = self.etree.Element
786 ElementTree = self.etree.ElementTree
787
788 f = StringIO()
789 for i in range(10):
790 element = Element('tag%s' % i)
791 self._check_element(element)
792 tree = ElementTree(element)
793 tree.write(f)
794 self._check_element_tree(tree)
795
797 Element = self.etree.Element
798 SubElement = self.etree.SubElement
799
800 el = Element('foo')
801 el2 = SubElement(el, 'bar')
802 el3 = SubElement(el2, 'baz')
803
804 al = Element('foo2')
805 al2 = SubElement(al, 'bar2')
806 al3 = SubElement(al2, 'baz2')
807
808 # now move al2 into el
809 el.append(al2)
810
811 # now change al3 directly
812 al3.text = 'baz2-modified'
813
814 # it should have changed through this route too
815 self.assertEquals(
816 'baz2-modified',
817 el[1][0].text)
818
820 Element = self.etree.Element
821 SubElement = self.etree.SubElement
822
823 a = Element('a')
824 b = SubElement(a, 'b')
825 a.text = 'hoi'
826 self.assertEquals(
827 'hoi',
828 a.text)
829 self.assertEquals(
830 'b',
831 a[0].tag)
832
834 Element = self.etree.Element
835 SubElement = self.etree.SubElement
836
837 a = Element('a')
838 a.text = 'hoi'
839 b = SubElement(a ,'b')
840 self.assertEquals(
841 'hoi',
842 a.text)
843 self.assertEquals(
844 'b',
845 a[0].tag)
846
848 Element = self.etree.Element
849
850 a = Element('a')
851
852 a.text = 'foo'
853 a.text = None
854
855 self.assertEquals(
856 None,
857 a.text)
858 self.assertXML('<a></a>', a)
859
861 Element = self.etree.Element
862
863 a = Element('a')
864 self.assertEquals(None, a.text)
865
866 a.text = ''
867 self.assertEquals('', a.text)
868 self.assertXML('<a></a>', a)
869
871 Element = self.etree.Element
872 SubElement = self.etree.SubElement
873
874 a = Element('a')
875 a.tail = 'dag'
876 self.assertEquals('dag',
877 a.tail)
878 b = SubElement(a, 'b')
879 b.tail = 'hoi'
880 self.assertEquals('hoi',
881 b.tail)
882 self.assertEquals('dag',
883 a.tail)
884
886 Element = self.etree.Element
887
888 a = Element('a')
889 b = Element('b')
890 b.tail = 'b_tail'
891 a.append(b)
892 self.assertEquals('b_tail',
893 b.tail)
894
896 Element = self.etree.Element
897 SubElement = self.etree.SubElement
898
899 a = Element('a')
900 b = SubElement(a, 'b')
901 b.tail = 'foo'
902 b.tail = 'bar'
903 self.assertEquals('bar',
904 b.tail)
905 self.assertXML('<a><b></b>bar</a>', a)
906
908 Element = self.etree.Element
909 a = Element('a')
910 a.tail = 'foo'
911 a.tail = None
912 self.assertEquals(
913 None,
914 a.tail)
915 self.assertXML('<a></a>', a)
916
918 Element = self.etree.Element
919 SubElement = self.etree.SubElement
920 Comment = self.etree.Comment
921
922 a = Element('a')
923 a.append(Comment('foo'))
924 self.assertEquals(a[0].tag, Comment)
925 self.assertEquals(a[0].text, 'foo')
926
928 Element = self.etree.Element
929 SubElement = self.etree.SubElement
930 Comment = self.etree.Comment
931
932 a = Element('a')
933 a.append(Comment('foo'))
934 self.assertEquals(a[0].text, 'foo')
935
936 a[0].text = "TEST"
937 self.assertEquals(a[0].text, 'TEST')
938
940 Element = self.etree.Element
941 SubElement = self.etree.SubElement
942 Comment = self.etree.Comment
943
944 a = Element('a')
945 a.append(Comment(' foo '))
946 self.assertEquals(a[0].text, ' foo ')
947
949 Comment = self.etree.Comment
950 c = Comment('foo')
951 self.assertEquals({}, c.attrib)
952 self.assertEquals([], c.keys())
953 self.assertEquals([], c.items())
954 self.assertEquals(None, c.get('hoi'))
955 self.assertEquals(0, len(c))
956 # should not iterate
957 for i in c:
958 pass
959
961 # lxml.etree separates target and text
962 Element = self.etree.Element
963 SubElement = self.etree.SubElement
964 ProcessingInstruction = self.etree.ProcessingInstruction
965
966 a = Element('a')
967 a.append(ProcessingInstruction('foo', 'some more text'))
968 self.assertEquals(a[0].tag, ProcessingInstruction)
969 self.assertXML("<a><?foo some more text?></a>",
970 a)
971
973 # lxml.etree separates target and text
974 Element = self.etree.Element
975 SubElement = self.etree.SubElement
976 ProcessingInstruction = self.etree.PI
977
978 a = Element('a')
979 a.append(ProcessingInstruction('foo', 'some more text'))
980 self.assertEquals(a[0].tag, ProcessingInstruction)
981 self.assertXML("<a><?foo some more text?></a>",
982 a)
983
985 ProcessingInstruction = self.etree.ProcessingInstruction
986 pi = ProcessingInstruction('foo')
987 self.assertEquals({}, pi.attrib)
988 self.assertEquals([], pi.keys())
989 self.assertEquals([], pi.items())
990 self.assertEquals(None, pi.get('hoi'))
991 self.assertEquals(0, len(pi))
992 # should not iterate
993 for i in pi:
994 pass
995
997 Element = self.etree.Element
998 SubElement = self.etree.SubElement
999
1000 a = Element('a')
1001 b = SubElement(a, 'b')
1002 c = Element('c')
1003 a[0] = c
1004 self.assertEquals(
1005 c,
1006 a[0])
1007 self.assertXML('<a><c></c></a>',
1008 a)
1009 self.assertXML('<b></b>',
1010 b)
1011
1013 Element = self.etree.Element
1014 SubElement = self.etree.SubElement
1015
1016 a = Element('a')
1017 for i in range(5):
1018 b = SubElement(a, 'b%s' % i)
1019 c = SubElement(b, 'c')
1020 for i in range(5):
1021 d = Element('d')
1022 e = SubElement(d, 'e')
1023 a[i] = d
1024 self.assertXML(
1025 '<a><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d></a>',
1026 a)
1027 self.assertXML('<c></c>',
1028 c)
1029
1031 Element = self.etree.Element
1032 SubElement = self.etree.SubElement
1033
1034 a = Element('a')
1035 SubElement(a, 'b')
1036 d = Element('d')
1037 a[0] = d
1038 self.assertXML('<a><d></d></a>', a)
1039
1041 Element = self.etree.Element
1042 SubElement = self.etree.SubElement
1043
1044 a = Element('a')
1045 b = SubElement(a, 'b')
1046
1047 self.assertRaises(IndexError, operator.setitem, a, 1, Element('c'))
1048
1050 Element = self.etree.Element
1051 SubElement = self.etree.SubElement
1052
1053 a = Element('a')
1054 b = SubElement(a, 'b')
1055 b.tail = 'B2'
1056 c = Element('c')
1057 c.tail = 'C2'
1058
1059 a[0] = c
1060 self.assertXML(
1061 '<a><c></c>C2</a>',
1062 a)
1063
1065 Element = self.etree.Element
1066 SubElement = self.etree.SubElement
1067
1068 a = Element('a')
1069 b = SubElement(a, 'b')
1070
1071 a.tag = 'c'
1072
1073 self.assertEquals(
1074 'c',
1075 a.tag)
1076
1077 self.assertXML(
1078 '<c><b></b></c>',
1079 a)
1080
1082 Element = self.etree.Element
1083 SubElement = self.etree.SubElement
1084 tostring = self.etree.tostring
1085
1086 a = Element('{a}a')
1087 b1 = SubElement(a, '{a}b')
1088 b2 = SubElement(a, '{b}b')
1089
1090 self.assertEquals('{a}b', b1.tag)
1091
1092 b1.tag = 'c'
1093
1094 # can't use C14N here!
1095 self.assertEquals('c', b1.tag)
1096 self.assertEquals('<c', tostring(b1)[:2])
1097 self.assert_('<c' in tostring(a))
1098
1100 Element = self.etree.Element
1101 SubElement = self.etree.SubElement
1102 tostring = self.etree.tostring
1103
1104 a = Element('{a}a')
1105 b1 = SubElement(a, '{a}b')
1106 b2 = SubElement(a, '{b}b')
1107
1108 a.tag = 'c'
1109
1110 self.assertEquals(
1111 'c',
1112 a.tag)
1113
1114 # can't use C14N here!
1115 self.assertEquals('c', a.tag)
1116 self.assertEquals('<c', tostring(a)[:2])
1117
1123
1124 a = Element("a")
1125 a.tag = strTest("TAG")
1126 self.assertXML('<TAG></TAG>',
1127 a)
1128
1130 Element = self.etree.Element
1131 SubElement = self.etree.SubElement
1132
1133 a = Element('a')
1134 b = SubElement(a, 'b')
1135 c = SubElement(a, 'c')
1136 d = SubElement(a, 'd')
1137
1138 del a[1]
1139 self.assertXML(
1140 '<a><b></b><d></d></a>',
1141 a)
1142
1143 del a[0]
1144 self.assertXML(
1145 '<a><d></d></a>',
1146 a)
1147
1148 del a[0]
1149 self.assertXML(
1150 '<a></a>',
1151 a)
1152 # move deleted element into other tree afterwards
1153 other = Element('other')
1154 other.append(c)
1155 self.assertXML(
1156 '<other><c></c></other>',
1157 other)
1158
1160 Element = self.etree.Element
1161 SubElement = self.etree.SubElement
1162
1163 a = Element('a')
1164 b = SubElement(a, 'b')
1165 bs = SubElement(b, 'bs')
1166 c = SubElement(a, 'c')
1167 cs = SubElement(c, 'cs')
1168
1169 el = a[0]
1170 self.assertXML(
1171 '<a><b><bs></bs></b><c><cs></cs></c></a>',
1172 a)
1173 self.assertXML('<b><bs></bs></b>', b)
1174 self.assertXML('<c><cs></cs></c>', c)
1175
1176 del a[0]
1177 self.assertXML(
1178 '<a><c><cs></cs></c></a>',
1179 a)
1180 self.assertXML('<b><bs></bs></b>', b)
1181 self.assertXML('<c><cs></cs></c>', c)
1182
1183 a.insert(0, el)
1184 self.assertXML(
1185 '<a><b><bs></bs></b><c><cs></cs></c></a>',
1186 a)
1187 self.assertXML('<b><bs></bs></b>', b)
1188 self.assertXML('<c><cs></cs></c>', c)
1189
1191 Element = self.etree.Element
1192 SubElement = self.etree.SubElement
1193
1194 a = Element('a')
1195 b = SubElement(a, 'b')
1196 bs = SubElement(b, 'bs')
1197 c = SubElement(a, 'c')
1198 cs = SubElement(c, 'cs')
1199
1200 el = a[0]
1201 del a[0]
1202 a[0] = el
1203 self.assertXML(
1204 '<a><b><bs></bs></b></a>',
1205 a)
1206 self.assertXML('<b><bs></bs></b>', b)
1207 self.assertXML('<c><cs></cs></c>', c)
1208
1210 Element = self.etree.Element
1211 SubElement = self.etree.SubElement
1212
1213 a = Element('a')
1214 b = SubElement(a, 'b')
1215 bs = SubElement(b, 'bs')
1216 c = SubElement(a, 'c')
1217 cs = SubElement(c, 'cs')
1218
1219 el = a[0]
1220 del a[0]
1221 a[0:0] = [el]
1222 self.assertXML(
1223 '<a><b><bs></bs></b><c><cs></cs></c></a>',
1224 a)
1225 self.assertXML('<b><bs></bs></b>', b)
1226 self.assertXML('<c><cs></cs></c>', c)
1227
1229 XML = self.etree.XML
1230 a = XML('<a><b></b>B2<c></c>C2</a>')
1231 b, c = a
1232
1233 a[:] = []
1234
1235 self.assertEquals("B2", b.tail)
1236 self.assertEquals("C2", c.tail)
1237
1239 ElementTree = self.etree.ElementTree
1240 f = StringIO('<a><b></b>B2<c></c>C2</a>')
1241 doc = ElementTree(file=f)
1242 a = doc.getroot()
1243 del a[0]
1244 self.assertXML(
1245 '<a><c></c>C2</a>',
1246 a)
1247
1249 Element = self.etree.Element
1250
1251 a = Element('a')
1252 a.text = 'foo'
1253 a.tail = 'bar'
1254 a.set('hoi', 'dag')
1255 a.clear()
1256 self.assertEquals(None, a.text)
1257 self.assertEquals(None, a.tail)
1258 self.assertEquals(None, a.get('hoi'))
1259 self.assertEquals('a', a.tag)
1260
1262 Element = self.etree.Element
1263 SubElement = self.etree.SubElement
1264
1265 a = Element('a')
1266 a.text = 'foo'
1267 a.tail = 'bar'
1268 a.set('hoi', 'dag')
1269 b = SubElement(a, 'b')
1270 c = SubElement(b, 'c')
1271 a.clear()
1272 self.assertEquals(None, a.text)
1273 self.assertEquals(None, a.tail)
1274 self.assertEquals(None, a.get('hoi'))
1275 self.assertEquals('a', a.tag)
1276 self.assertEquals(0, len(a))
1277 self.assertXML('<a></a>',
1278 a)
1279 self.assertXML('<b><c></c></b>',
1280 b)
1281
1283 ElementTree = self.etree.ElementTree
1284 f = StringIO('<a><b></b>B2<c></c>C2</a>')
1285 doc = ElementTree(file=f)
1286 a = doc.getroot()
1287 a.clear()
1288 self.assertXML(
1289 '<a></a>',
1290 a)
1291
1293 Element = self.etree.Element
1294 SubElement = self.etree.SubElement
1295
1296 a = Element('a')
1297 b = SubElement(a, 'b')
1298 c = SubElement(a, 'c')
1299 d = Element('d')
1300 a.insert(0, d)
1301
1302 self.assertEquals(
1303 d,
1304 a[0])
1305
1306 self.assertXML(
1307 '<a><d></d><b></b><c></c></a>',
1308 a)
1309
1310 e = Element('e')
1311 a.insert(2, e)
1312 self.assertEquals(
1313 e,
1314 a[2])
1315 self.assertXML(
1316 '<a><d></d><b></b><e></e><c></c></a>',
1317 a)
1318
1320 Element = self.etree.Element
1321 SubElement = self.etree.SubElement
1322
1323 a = Element('a')
1324 b = SubElement(a, 'b')
1325 c = Element('c')
1326
1327 a.insert(2, c)
1328 self.assertEquals(
1329 c,
1330 a[1])
1331 self.assertXML(
1332 '<a><b></b><c></c></a>',
1333 a)
1334
1336 Element = self.etree.Element
1337 SubElement = self.etree.SubElement
1338
1339 a = Element('a')
1340 b = SubElement(a, 'b')
1341 c = SubElement(a, 'c')
1342
1343 d = Element('d')
1344 a.insert(-1, d)
1345 self.assertEquals(
1346 d,
1347 a[-2])
1348 self.assertXML(
1349 '<a><b></b><d></d><c></c></a>',
1350 a)
1351
1353 Element = self.etree.Element
1354 SubElement = self.etree.SubElement
1355
1356 a = Element('a')
1357 b = SubElement(a, 'b')
1358
1359 c = Element('c')
1360 c.tail = 'C2'
1361
1362 a.insert(0, c)
1363 self.assertXML(
1364 '<a><c></c>C2<b></b></a>',
1365 a)
1366
1368 Element = self.etree.Element
1369 SubElement = self.etree.SubElement
1370
1371 a = Element('a')
1372 b = SubElement(a, 'b')
1373 c = SubElement(a, 'c')
1374
1375 a.remove(b)
1376 self.assertEquals(
1377 c,
1378 a[0])
1379 self.assertXML(
1380 '<a><c></c></a>',
1381 a)
1382
1384 Element = self.etree.Element
1385 SubElement = self.etree.SubElement
1386
1387 a = Element('{http://test}a')
1388 b = SubElement(a, '{http://test}b')
1389 c = SubElement(a, '{http://test}c')
1390
1391 a.remove(b)
1392 self.assertXML(
1393 '<ns0:a xmlns:ns0="http://test"><ns0:c></ns0:c></ns0:a>',
1394 a)
1395 self.assertXML(
1396 '<ns0:b xmlns:ns0="http://test"></ns0:b>',
1397 b)
1398
1400 Element = self.etree.Element
1401 SubElement = self.etree.SubElement
1402
1403 a = Element('a')
1404 b = SubElement(a, 'b')
1405 c = SubElement(a, 'c')
1406 d = Element('d')
1407 self.assertRaises(
1408 ValueError, a.remove, d)
1409
1411 Element = self.etree.Element
1412 SubElement = self.etree.SubElement
1413
1414 a = Element('a')
1415 b = SubElement(a, 'b')
1416 b.tail = 'b2'
1417 a.remove(b)
1418 self.assertXML(
1419 '<a></a>',
1420 a)
1421 self.assertEquals('b2', b.tail)
1422
1424 Element = self.etree.Element
1425 SubElement = self.etree.SubElement
1426
1427 a = Element('a')
1428 b = SubElement(a, 'b')
1429 c = SubElement(a, 'c')
1430 d = SubElement(b, 'd')
1431 e = SubElement(c, 'e')
1432 self.assertXML(
1433 '<a><b><d></d></b><c><e></e></c></a>',
1434 a)
1435 self.assertEquals(
1436 [b, c],
1437 a.getchildren())
1438 self.assertEquals(
1439 [d],
1440 b.getchildren())
1441 self.assertEquals(
1442 [],
1443 d.getchildren())
1444
1446 Element = self.etree.Element
1447
1448 a = Element('a')
1449 b = a.makeelement('c', {'hoi':'dag'})
1450 self.assertXML(
1451 '<c hoi="dag"></c>',
1452 b)
1453
1455 Element = self.etree.Element
1456 SubElement = self.etree.SubElement
1457
1458 a = Element('a')
1459 b = SubElement(a, 'b')
1460 c = SubElement(a, 'c')
1461 d = SubElement(b, 'd')
1462 e = SubElement(c, 'e')
1463
1464 self.assertEquals(
1465 [a, b, d, c, e],
1466 list(a.getiterator()))
1467 self.assertEquals(
1468 [d],
1469 list(d.getiterator()))
1470
1472 Element = self.etree.Element
1473 SubElement = self.etree.SubElement
1474
1475 a = Element('a')
1476 b = SubElement(a, 'b')
1477 c = SubElement(a, 'c')
1478 d = SubElement(b, 'd')
1479 e = SubElement(c, 'e')
1480
1481 self.assertEquals(
1482 [],
1483 list(a.getiterator('none')))
1484 self.assertEquals(
1485 [],
1486 list(e.getiterator('none')))
1487 self.assertEquals(
1488 [e],
1489 list(e.getiterator()))
1490
1492 Element = self.etree.Element
1493 SubElement = self.etree.SubElement
1494
1495 a = Element('a')
1496 b = SubElement(a, 'b')
1497 c = SubElement(a, 'c')
1498 d = SubElement(b, 'd')
1499 e = SubElement(c, 'e')
1500
1501 self.assertEquals(
1502 [a],
1503 list(a.getiterator('a')))
1504 a2 = SubElement(e, 'a')
1505 self.assertEquals(
1506 [a, a2],
1507 list(a.getiterator('a')))
1508 self.assertEquals(
1509 [a2],
1510 list(c.getiterator('a')))
1511
1513 Element = self.etree.Element
1514 SubElement = self.etree.SubElement
1515
1516 a = Element('a')
1517 b = SubElement(a, 'b')
1518 c = SubElement(a, 'c')
1519 d = SubElement(b, 'd')
1520 e = SubElement(c, 'e')
1521
1522 self.assertEquals(
1523 [a, b, d, c, e],
1524 list(a.getiterator('*')))
1525
1527 Element = self.etree.Element
1528 Comment = self.etree.Comment
1529 SubElement = self.etree.SubElement
1530
1531 a = Element('a')
1532 b = SubElement(a, 'b')
1533 comment_b = Comment("TEST-b")
1534 b.append(comment_b)
1535
1536 self.assertEquals(
1537 [comment_b],
1538 list(a.getiterator(Comment)))
1539
1540 comment_a = Comment("TEST-a")
1541 a.append(comment_a)
1542
1543 self.assertEquals(
1544 [comment_b, comment_a],
1545 list(a.getiterator(Comment)))
1546
1547 self.assertEquals(
1548 [comment_b],
1549 list(b.getiterator(Comment)))
1550
1552 Element = self.etree.Element
1553 PI = self.etree.ProcessingInstruction
1554 SubElement = self.etree.SubElement
1555
1556 a = Element('a')
1557 b = SubElement(a, 'b')
1558 pi_b = PI("TEST-b")
1559 b.append(pi_b)
1560
1561 self.assertEquals(
1562 [pi_b],
1563 list(a.getiterator(PI)))
1564
1565 pi_a = PI("TEST-a")
1566 a.append(pi_a)
1567
1568 self.assertEquals(
1569 [pi_b, pi_a],
1570 list(a.getiterator(PI)))
1571
1572 self.assertEquals(
1573 [pi_b],
1574 list(b.getiterator(PI)))
1575
1577 Element = self.etree.Element
1578 SubElement = self.etree.SubElement
1579
1580 a = Element('a')
1581 a.text = 'a'
1582 b = SubElement(a, 'b')
1583 b.text = 'b'
1584 b.tail = 'b1'
1585 c = SubElement(a, 'c')
1586 c.text = 'c'
1587 c.tail = 'c1'
1588 d = SubElement(b, 'd')
1589 c.text = 'd'
1590 c.tail = 'd1'
1591 e = SubElement(c, 'e')
1592 e.text = 'e'
1593 e.tail = 'e1'
1594
1595 self.assertEquals(
1596 [a, b, d, c, e],
1597 list(a.getiterator()))
1598 #self.assertEquals(
1599 # [d],
1600 # list(d.getiterator()))
1601
1603 Element = self.etree.Element
1604 SubElement = self.etree.SubElement
1605
1606 a = Element('a')
1607 a.text = 'a'
1608 b = SubElement(a, 'b')
1609 b.text = 'b'
1610 b.tail = 'b1'
1611 c = SubElement(a, 'c')
1612 c.text = 'c'
1613 c.tail = 'c1'
1614 d = SubElement(b, 'd')
1615 c.text = 'd'
1616 c.tail = 'd1'
1617 e = SubElement(c, 'e')
1618 e.text = 'e'
1619 e.tail = 'e1'
1620
1621 self.assertEquals(
1622 [a],
1623 list(a.getiterator('a')))
1624 a2 = SubElement(e, 'a')
1625 self.assertEquals(
1626 [a, a2],
1627 list(a.getiterator('a')))
1628 self.assertEquals(
1629 [a2],
1630 list(e.getiterator('a')))
1631
1633 Element = self.etree.Element
1634
1635 a = Element('a')
1636 a.attrib['foo'] = 'Foo'
1637 a.attrib['bar'] = 'Bar'
1638 self.assertEquals('Foo', a.attrib['foo'])
1639 del a.attrib['foo']
1640 self.assertRaises(KeyError, operator.getitem, a.attrib, 'foo')
1641
1643 Element = self.etree.Element
1644 SubElement = self.etree.SubElement
1645
1646 a = Element('a')
1647 b = SubElement(a, 'b')
1648 c = SubElement(a, 'c')
1649 d = SubElement(a, 'd')
1650
1651 self.assertEquals(
1652 [b, c],
1653 a[0:2])
1654 self.assertEquals(
1655 [b, c, d],
1656 a[:])
1657 self.assertEquals(
1658 [b, c, d],
1659 a[:10])
1660 self.assertEquals(
1661 [b],
1662 a[0:1])
1663 self.assertEquals(
1664 [],
1665 a[10:12])
1666
1668 Element = self.etree.Element
1669 SubElement = self.etree.SubElement
1670
1671 a = Element('a')
1672 b = SubElement(a, 'b')
1673 c = SubElement(a, 'c')
1674 d = SubElement(a, 'd')
1675
1676 self.assertEquals(
1677 [d],
1678 a[-1:])
1679 self.assertEquals(
1680 [c, d],
1681 a[-2:])
1682 self.assertEquals(
1683 [c],
1684 a[-2:-1])
1685 self.assertEquals(
1686 [b, c],
1687 a[-3:-1])
1688 self.assertEquals(
1689 [b, c],
1690 a[-3:2])
1691
1693 Element = self.etree.Element
1694 SubElement = self.etree.SubElement
1695
1696 a = Element('a')
1697 b = SubElement(a, 'b')
1698 c = SubElement(a, 'c')
1699 d = SubElement(a, 'd')
1700 e = SubElement(a, 'e')
1701
1702 self.assertEquals(
1703 [e,d,c,b],
1704 a[::-1])
1705 self.assertEquals(
1706 [b,d],
1707 a[::2])
1708 self.assertEquals(
1709 [e,c],
1710 a[::-2])
1711 self.assertEquals(
1712 [d,c],
1713 a[-2:0:-1])
1714 self.assertEquals(
1715 [e],
1716 a[:1:-2])
1717
1719 ElementTree = self.etree.ElementTree
1720
1721 f = StringIO('<a><b>B</b>B1<c>C</c>C1</a>')
1722 doc = ElementTree(file=f)
1723 a = doc.getroot()
1724 b = a[0]
1725 c = a[1]
1726 self.assertEquals(
1727 [b, c],
1728 a[:])
1729 self.assertEquals(
1730 [b],
1731 a[0:1])
1732 self.assertEquals(
1733 [c],
1734 a[1:])
1735
1737 Element = self.etree.Element
1738 Comment = self.etree.Comment
1739 SubElement = self.etree.SubElement
1740
1741 a = Element('a')
1742 b = SubElement(a, 'b')
1743 foo = Comment('foo')
1744 a.append(foo)
1745 c = SubElement(a, 'c')
1746 self.assertEquals(
1747 [b, foo, c],
1748 a[:])
1749 self.assertEquals(
1750 foo,
1751 a[1])
1752 a[1] = new = Element('new')
1753 self.assertEquals(
1754 new,
1755 a[1])
1756 self.assertXML(
1757 '<a><b></b><new></new><c></c></a>',
1758 a)
1759
1761 Element = self.etree.Element
1762 SubElement = self.etree.SubElement
1763
1764 a = Element('a')
1765 b = SubElement(a, 'b')
1766 c = SubElement(a, 'c')
1767 d = SubElement(a, 'd')
1768 e = SubElement(a, 'e')
1769
1770 del a[1:3]
1771 self.assertEquals(
1772 [b, e],
1773 list(a))
1774
1776 Element = self.etree.Element
1777 SubElement = self.etree.SubElement
1778
1779 a = Element('a')
1780 b = SubElement(a, 'b')
1781 c = SubElement(a, 'c')
1782 d = SubElement(a, 'd')
1783 e = SubElement(a, 'e')
1784
1785 del a[1:-1]
1786 self.assertEquals(
1787 [b, e],
1788 list(a))
1789
1791 Element = self.etree.Element
1792 SubElement = self.etree.SubElement
1793
1794 a = Element('a')
1795 b = SubElement(a, 'b')
1796 c = SubElement(a, 'c')
1797 d = SubElement(a, 'd')
1798 e = SubElement(a, 'e')
1799
1800 del a[-3:-1]
1801 self.assertEquals(
1802 [b, e],
1803 list(a))
1804
1806 Element = self.etree.Element
1807 SubElement = self.etree.SubElement
1808
1809 a = Element('a')
1810 b = SubElement(a, 'b')
1811 c = SubElement(a, 'c')
1812 d = SubElement(a, 'd')
1813 e = SubElement(a, 'e')
1814
1815 del a[1::2]
1816 self.assertEquals(
1817 [b, d],
1818 list(a))
1819
1821 Element = self.etree.Element
1822 SubElement = self.etree.SubElement
1823
1824 a = Element('a')
1825 b = SubElement(a, 'b')
1826 c = SubElement(a, 'c')
1827 d = SubElement(a, 'd')
1828 e = SubElement(a, 'e')
1829
1830 del a[::-1]
1831 self.assertEquals(
1832 [],
1833 list(a))
1834
1836 Element = self.etree.Element
1837 SubElement = self.etree.SubElement
1838
1839 a = Element('a')
1840 b = SubElement(a, 'b')
1841 c = SubElement(a, 'c')
1842 d = SubElement(a, 'd')
1843 e = SubElement(a, 'e')
1844
1845 del a[::-2]
1846 self.assertEquals(
1847 [b, d],
1848 list(a))
1849
1851 ElementTree = self.etree.ElementTree
1852 f = StringIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>')
1853 doc = ElementTree(file=f)
1854 a = doc.getroot()
1855 del a[1:3]
1856 self.assertXML(
1857 '<a><b></b>B2<e></e>E2</a>',
1858 a)
1859
1861 XML = self.etree.XML
1862 a = XML('<a><b></b>B2<c></c>C2</a>')
1863 b, c = a
1864
1865 del a[:]
1866
1867 self.assertEquals("B2", b.tail)
1868 self.assertEquals("C2", c.tail)
1869
1871 # this could trigger a crash
1872 Element = self.etree.Element
1873 SubElement = self.etree.SubElement
1874 a = Element('a')
1875 b = SubElement(a, 'b')
1876 c = SubElement(b, 'c')
1877 del b # no more reference to b
1878 del a[:]
1879 self.assertEquals('c', c.tag)
1880
1882 Element = self.etree.Element
1883 SubElement = self.etree.SubElement
1884
1885 a = Element('a')
1886 b = SubElement(a, 'b')
1887 c = SubElement(a, 'c')
1888 d = SubElement(a, 'd')
1889
1890 e = Element('e')
1891 f = Element('f')
1892 g = Element('g')
1893
1894 s = [e, f, g]
1895 a[1:2] = s
1896 self.assertEquals(
1897 [b, e, f, g, d],
1898 list(a))
1899
1901 Element = self.etree.Element
1902 SubElement = self.etree.SubElement
1903
1904 a = Element('a')
1905 b = SubElement(a, 'b')
1906 c = SubElement(a, 'c')
1907
1908 e = Element('e')
1909 f = Element('f')
1910 g = Element('g')
1911
1912 s = [e, f, g]
1913 a[:] = s
1914 self.assertEquals(
1915 [e, f, g],
1916 list(a))
1917
1919 Element = self.etree.Element
1920 SubElement = self.etree.SubElement
1921
1922 a = Element('a')
1923
1924 e = Element('e')
1925 f = Element('f')
1926 g = Element('g')
1927
1928 s = [e, f, g]
1929 a[:] = s
1930 self.assertEquals(
1931 [e, f, g],
1932 list(a))
1933
1935 Element = self.etree.Element
1936 SubElement = self.etree.SubElement
1937
1938 a = Element('a')
1939 b = SubElement(a, 'b')
1940 c = SubElement(a, 'c')
1941 d = SubElement(a, 'd')
1942
1943 s = [b, c, d]
1944 a[:] = s
1945 self.assertEquals(
1946 [b, c, d],
1947 list(a))
1948
1950 Element = self.etree.Element
1951 SubElement = self.etree.SubElement
1952
1953 a = Element('a')
1954 b = SubElement(a, 'b')
1955 c = SubElement(a, 'c')
1956 d = SubElement(a, 'd')
1957
1958 s = [d, c, b]
1959 a[:] = s
1960 self.assertEquals(
1961 [d, c, b],
1962 list(a))
1963
1965 Element = self.etree.Element
1966 SubElement = self.etree.SubElement
1967
1968 a = Element('a')
1969 b = SubElement(a, 'b')
1970 c = SubElement(a, 'c')
1971
1972 e = Element('e')
1973 f = Element('f')
1974 g = Element('g')
1975 h = Element('h')
1976
1977 s = [e, f]
1978 a[99:] = s
1979 self.assertEquals(
1980 [a, b, e, f],
1981 list(a))
1982
1983 s = [g, h]
1984 a[:0] = s
1985 self.assertEquals(
1986 [g, h, a, b, e, f],
1987 list(a))
1988
1990 Element = self.etree.Element
1991 SubElement = self.etree.SubElement
1992
1993 a = Element('a')
1994 b = SubElement(a, 'b')
1995 c = SubElement(a, 'c')
1996
1997 e = Element('e')
1998 f = Element('f')
1999
2000 s = [e]
2001 a[0:1] = s
2002 self.assertEquals(
2003 [e, c],
2004 list(a))
2005
2006 s = [f]
2007 a[1:2] = s
2008 self.assertEquals(
2009 [e, f],
2010 list(a))
2011
2013 ElementTree = self.etree.ElementTree
2014 Element = self.etree.Element
2015 f = StringIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>')
2016 doc = ElementTree(file=f)
2017 a = doc.getroot()
2018 x = Element('x')
2019 y = Element('y')
2020 z = Element('z')
2021 x.tail = 'X2'
2022 y.tail = 'Y2'
2023 z.tail = 'Z2'
2024 a[1:3] = [x, y, z]
2025 self.assertXML(
2026 '<a><b></b>B2<x></x>X2<y></y>Y2<z></z>Z2<e></e>E2</a>',
2027 a)
2028
2030 Element = self.etree.Element
2031 SubElement = self.etree.SubElement
2032
2033 a = Element('a')
2034 b = SubElement(a, 'b')
2035 c = SubElement(a, 'c')
2036 d = SubElement(a, 'd')
2037
2038 x = Element('x')
2039 y = Element('y')
2040
2041 a[1:-1] = [x, y]
2042 self.assertEquals(
2043 [b, x, y, d],
2044 list(a))
2045
2047 Element = self.etree.Element
2048 SubElement = self.etree.SubElement
2049
2050 a = Element('a')
2051 b = SubElement(a, 'b')
2052 c = SubElement(a, 'c')
2053 d = SubElement(a, 'd')
2054
2055 x = Element('x')
2056 y = Element('y')
2057
2058 a[1:-2] = [x, y]
2059 self.assertEquals(
2060 [b, x, y, c, d],
2061 list(a))
2062
2064 Element = self.etree.Element
2065 SubElement = self.etree.SubElement
2066
2067 a = Element('a')
2068 b = SubElement(a, 'b')
2069 c = SubElement(a, 'c')
2070 d = SubElement(a, 'd')
2071
2072 e = Element('e')
2073 f = Element('f')
2074 g = Element('g')
2075
2076 s = [e, f, g]
2077 a[3:] = s
2078 self.assertEquals(
2079 [b, c, d, e, f, g],
2080 list(a))
2081
2083 Element = self.etree.Element
2084
2085 a = Element('a')
2086
2087 b = Element('b')
2088 c = Element('c')
2089
2090 a[:] = [b, c]
2091 self.assertEquals(
2092 [b, c],
2093 list(a))
2094
2096 Element = self.etree.Element
2097 ElementTree = self.etree.ElementTree
2098
2099 a = Element('a')
2100 a.tail = 'A2'
2101 t = ElementTree(element=a)
2102 self.assertEquals('A2',
2103 a.tail)
2104
2106 Element = self.etree.Element
2107 SubElement = self.etree.SubElement
2108 ElementTree = self.etree.ElementTree
2109
2110 a = Element('a')
2111 b = SubElement(a, 'b')
2112 c = SubElement(a, 'c')
2113 d = SubElement(b, 'd')
2114 e = SubElement(c, 'e')
2115 t = ElementTree(element=a)
2116
2117 self.assertEquals(
2118 [a, b, d, c, e],
2119 list(t.getiterator()))
2120
2122 Element = self.etree.Element
2123 SubElement = self.etree.SubElement
2124 ElementTree = self.etree.ElementTree
2125 a = Element('a')
2126 b = SubElement(a, 'b')
2127 c = SubElement(a, 'c')
2128 d = SubElement(b, 'd')
2129 e = SubElement(c, 'e')
2130 t = ElementTree(element=a)
2131
2132 self.assertEquals(
2133 [a],
2134 list(t.getiterator('a')))
2135 a2 = SubElement(e, 'a')
2136 self.assertEquals(
2137 [a, a2],
2138 list(t.getiterator('a')))
2139
2141 ElementTree = self.etree.ElementTree
2142 ns = 'http://xml.infrae.com/1'
2143 f = StringIO('<x:a xmlns:x="%s"><x:b></x:b></x:a>' % ns)
2144 t = ElementTree(file=f)
2145 a = t.getroot()
2146 self.assertEquals('{%s}a' % ns,
2147 a.tag)
2148 self.assertEquals('{%s}b' % ns,
2149 a[0].tag)
2150
2152 ElementTree = self.etree.ElementTree
2153 ns = 'http://xml.infrae.com/1'
2154 ns2 = 'http://xml.infrae.com/2'
2155 f = StringIO('<x:a xmlns:x="%s" xmlns:y="%s"><x:b></x:b><y:b></y:b></x:a>' % (ns, ns2))
2156 t = ElementTree(file=f)
2157 a = t.getroot()
2158 self.assertEquals('{%s}a' % ns,
2159 a.tag)
2160 self.assertEquals('{%s}b' % ns,
2161 a[0].tag)
2162 self.assertEquals('{%s}b' % ns2,
2163 a[1].tag)
2164
2166 Element = self.etree.Element
2167 SubElement = self.etree.SubElement
2168 ns = 'http://xml.infrae.com/1'
2169 ns2 = 'http://xml.infrae.com/2'
2170 a = Element('{%s}a' % ns)
2171 b = SubElement(a, '{%s}b' % ns2)
2172 c = SubElement(a, '{%s}c' % ns)
2173 self.assertEquals('{%s}a' % ns,
2174 a.tag)
2175 self.assertEquals('{%s}b' % ns2,
2176 b.tag)
2177 self.assertEquals('{%s}c' % ns,
2178 c.tag)
2179 self.assertEquals('{%s}a' % ns,
2180 a.tag)
2181 self.assertEquals('{%s}b' % ns2,
2182 b.tag)
2183 self.assertEquals('{%s}c' % ns,
2184 c.tag)
2185
2187 Element = self.etree.Element
2188 SubElement = self.etree.SubElement
2189 ElementTree = self.etree.ElementTree
2190
2191 ns = 'http://xml.infrae.com/1'
2192 ns2 = 'http://xml.infrae.com/2'
2193 f = StringIO('<a xmlns="%s" xmlns:x="%s"><x:b></x:b><b></b></a>' % (ns, ns2))
2194 t = ElementTree(file=f)
2195
2196 a = t.getroot()
2197 self.assertEquals('{%s}a' % ns,
2198 a.tag)
2199 self.assertEquals('{%s}b' % ns2,
2200 a[0].tag)
2201 self.assertEquals('{%s}b' % ns,
2202 a[1].tag)
2203
2205 Element = self.etree.Element
2206 ns = 'http://xml.infrae.com/1'
2207 ns2 = 'http://xml.infrae.com/2'
2208 a = Element('a')
2209 a.set('{%s}foo' % ns, 'Foo')
2210 a.set('{%s}bar' % ns2, 'Bar')
2211 self.assertEquals(
2212 'Foo',
2213 a.get('{%s}foo' % ns))
2214 self.assertEquals(
2215 'Bar',
2216 a.get('{%s}bar' % ns2))
2217 try:
2218 self.assertXML(
2219 '<a xmlns:ns0="%s" xmlns:ns1="%s" ns0:foo="Foo" ns1:bar="Bar"></a>' % (ns, ns2),
2220 a)
2221 except AssertionError:
2222 self.assertXML(
2223 '<a xmlns:ns0="%s" xmlns:ns1="%s" ns1:foo="Foo" ns0:bar="Bar"></a>' % (ns2, ns),
2224 a)
2225
2227 Element = self.etree.Element
2228 ElementTree = self.etree.ElementTree
2229
2230 one = self.etree.parse(
2231 StringIO('<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>'))
2232 baz = one.getroot()[0][0]
2233
2234 two = ElementTree(Element('root'))
2235 two.getroot().append(baz)
2236 # removing the originating document could cause a crash/error before
2237 # as namespace is not moved along with it
2238 del one
2239 self.assertEquals('{http://a.b.c}baz', baz.tag)
2240
2242 tostring = self.etree.tostring
2243 root = self.etree.XML(
2244 '<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>')
2245 baz = root[0][0]
2246
2247 nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']",
2248 tostring(baz))
2249 self.assertEquals(["http://a.b.c"], nsdecl)
2250
2252 tostring = self.etree.tostring
2253 root = self.etree.XML(
2254 '<foo><bar xmlns="http://a.b.c"><baz/></bar></foo>')
2255 baz = root[0][0]
2256
2257 nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']",
2258 tostring(baz))
2259 self.assertEquals(["http://a.b.c"], nsdecl)
2260
2262 tostring = self.etree.tostring
2263 root = self.etree.XML(
2264 '<foo xmlns:ns="http://a.b.c"><bar><ns:baz/></bar></foo>')
2265 baz = root[0][0]
2266
2267 nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']",
2268 tostring(baz))
2269
2270 self.assertEquals(["http://a.b.c"], nsdecl)
2271
2273 Element = self.etree.Element
2274 SubElement = self.etree.SubElement
2275
2276 root = Element("foo")
2277 bar = SubElement(root, "{http://a.b.c}bar")
2278 baz = SubElement(bar, "{http://a.b.c}baz")
2279
2280 nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']",
2281 self.etree.tostring(baz))
2282
2283 self.assertEquals(["http://a.b.c"], nsdecl)
2284
2286 Element = self.etree.Element
2287
2288 root = Element('element')
2289
2290 subelement = Element('subelement',
2291 {"{http://www.w3.org/XML/1998/namespace}id": "foo"})
2292 self.assertEquals(1, len(subelement.attrib))
2293 self.assertEquals(
2294 "foo",
2295 subelement.get("{http://www.w3.org/XML/1998/namespace}id"))
2296
2297 root.append(subelement)
2298 self.assertEquals(1, len(subelement.attrib))
2299 self.assertEquals(
2300 {"{http://www.w3.org/XML/1998/namespace}id" : "foo"}.items(),
2301 subelement.attrib.items())
2302 self.assertEquals(
2303 "foo",
2304 subelement.get("{http://www.w3.org/XML/1998/namespace}id"))
2305
2307 tostring = self.etree.tostring
2308 Element = self.etree.Element
2309 SubElement = self.etree.SubElement
2310
2311 a = Element('a')
2312 b = SubElement(a, 'b')
2313 c = SubElement(a, 'c')
2314
2315 self.assertEquals('<a><b></b><c></c></a>',
2316 canonicalize(tostring(a)))
2317
2319 tostring = self.etree.tostring
2320 Element = self.etree.Element
2321 SubElement = self.etree.SubElement
2322
2323 a = Element('a')
2324 b = SubElement(a, 'b')
2325 c = SubElement(a, 'c')
2326 d = SubElement(c, 'd')
2327 self.assertEquals('<b></b>',
2328 canonicalize(tostring(b)))
2329 self.assertEquals('<c><d></d></c>',
2330 canonicalize(tostring(c)))
2331
2333 tostring = self.etree.tostring
2334 Element = self.etree.Element
2335 SubElement = self.etree.SubElement
2336
2337 a = Element('a')
2338 b = SubElement(a, 'b')
2339 c = SubElement(a, 'c')
2340 d = SubElement(c, 'd')
2341 b.tail = 'Foo'
2342
2343 self.assert_(tostring(b) == '<b/>Foo' or
2344 tostring(b) == '<b />Foo')
2345
2347 tostring = self.etree.tostring
2348 Element = self.etree.Element
2349 SubElement = self.etree.SubElement
2350
2351 html = Element('html')
2352 body = SubElement(html, 'body')
2353 p = SubElement(body, 'p')
2354 p.text = "html"
2355 SubElement(p, 'br').tail = "test"
2356
2357 self.assertEquals('<html><body><p>html<br>test</p></body></html>',
2358 tostring(html, method="html"))
2359
2361 tostring = self.etree.tostring
2362 Element = self.etree.Element
2363 SubElement = self.etree.SubElement
2364
2365 a = Element('a')
2366 a.text = "A"
2367 a.tail = "tail"
2368 b = SubElement(a, 'b')
2369 b.text = "B"
2370 b.tail = "TAIL"
2371 c = SubElement(a, 'c')
2372 c.text = "C"
2373
2374 self.assertEquals('ABTAILCtail',
2375 tostring(a, method="text"))
2376
2378 iterparse = self.etree.iterparse
2379 f = StringIO('<a><b></b><c/></a>')
2380
2381 iterator = iterparse(f)
2382 self.assertEquals(None,
2383 iterator.root)
2384 events = list(iterator)
2385 root = iterator.root
2386 self.assertEquals(
2387 [('end', root[0]), ('end', root[1]), ('end', root)],
2388 events)
2389
2391 iterparse = self.etree.iterparse
2392 iterator = iterparse(fileInTestDir("test.xml"))
2393 self.assertEquals(None,
2394 iterator.root)
2395 events = list(iterator)
2396 root = iterator.root
2397 self.assertEquals(
2398 [('end', root[0]), ('end', root)],
2399 events)
2400
2402 iterparse = self.etree.iterparse
2403 f = StringIO('<a><b></b><c/></a>')
2404
2405 iterator = iterparse(f, events=('start',))
2406 events = list(iterator)
2407 root = iterator.root
2408 self.assertEquals(
2409 [('start', root), ('start', root[0]), ('start', root[1])],
2410 events)
2411
2413 iterparse = self.etree.iterparse
2414 f = StringIO('<a><b></b><c/></a>')
2415
2416 iterator = iterparse(f, events=('start','end'))
2417 events = list(iterator)
2418 root = iterator.root
2419 self.assertEquals(
2420 [('start', root), ('start', root[0]), ('end', root[0]),
2421 ('start', root[1]), ('end', root[1]), ('end', root)],
2422 events)
2423
2425 iterparse = self.etree.iterparse
2426 f = StringIO('<a><b></b><c/></a>')
2427
2428 iterator = iterparse(f)
2429 for event, elem in iterator:
2430 elem.clear()
2431
2432 root = iterator.root
2433 self.assertEquals(0,
2434 len(root))
2435
2437 iterparse = self.etree.iterparse
2438 CHILD_COUNT = 12345
2439 f = StringIO('<a>%s</a>' % ('<b>test</b>'*CHILD_COUNT))
2440
2441 i = 0
2442 for key in iterparse(f):
2443 event, element = key
2444 i += 1
2445 self.assertEquals(i, CHILD_COUNT + 1)
2446
2448 iterparse = self.etree.iterparse
2449 f = StringIO('<a xmlns="ns1"><b><c xmlns="ns2"/></b></a>')
2450
2451 attr_name = '{testns}bla'
2452 events = []
2453 iterator = iterparse(f, events=('start','end','start-ns','end-ns'))
2454 for event, elem in iterator:
2455 events.append(event)
2456 if event == 'start':
2457 if elem.tag != '{ns1}a':
2458 elem.set(attr_name, 'value')
2459
2460 self.assertEquals(
2461 ['start-ns', 'start', 'start', 'start-ns', 'start',
2462 'end', 'end-ns', 'end', 'end', 'end-ns'],
2463 events)
2464
2465 root = iterator.root
2466 self.assertEquals(
2467 None,
2468 root.get(attr_name))
2469 self.assertEquals(
2470 'value',
2471 root[0].get(attr_name))
2472
2474 iterparse = self.etree.iterparse
2475 f = StringIO('<a><b><d/></b><c/></a>')
2476
2477 counts = []
2478 for event, elem in iterparse(f):
2479 counts.append(len(list(elem.getiterator())))
2480 self.assertEquals(
2481 [1,2,1,4],
2482 counts)
2483
2485 parse = self.etree.parse
2486 # from file
2487 tree = parse(fileInTestDir('test.xml'))
2488 self.assertXML(
2489 '<a><b></b></a>',
2490 tree.getroot())
2491
2495
2497 parse = self.etree.parse
2498 # from file object
2499 f = open(fileInTestDir('test.xml'), 'r')
2500 tree = parse(f)
2501 f.close()
2502 self.assertXML(
2503 '<a><b></b></a>',
2504 tree.getroot())
2505
2507 parse = self.etree.parse
2508 # from StringIO
2509 f = StringIO('<a><b></b></a>')
2510 tree = parse(f)
2511 f.close()
2512 self.assertXML(
2513 '<a><b></b></a>',
2514 tree.getroot()
2515 )
2516
2518 # this can fail in libxml2 <= 2.6.22
2519 parse = self.etree.parse
2520 tree = parse(StringIO('<?xml version="1.0" encoding="ascii"?><html/>'))
2521 self.assertXML('<html></html>',
2522 tree.getroot())
2523
2525 Element = self.etree.Element
2526
2527 a = Element('a')
2528 a.text = u'Søk på nettet'
2529 self.assertXML(
2530 u'<a>Søk på nettet</a>'.encode('UTF-8'),
2531 a, 'utf-8')
2532
2534 ElementTree = self.etree.ElementTree
2535 Element = self.etree.Element
2536
2537 a = Element('a')
2538 a.text = u'Søk på nettet'
2539
2540 f = StringIO()
2541 tree = ElementTree(element=a)
2542 tree.write(f, encoding='utf-8')
2543 self.assertEquals(u'<a>Søk på nettet</a>'.encode('UTF-8'),
2544 f.getvalue())
2545
2547 parse = self.etree.parse
2548 # from file
2549 tree = parse(fileInTestDir('test-string.xml'))
2550 self.assertXML(
2551 u'<a>Søk på nettet</a>'.encode('UTF-8'),
2552 tree.getroot(), 'UTF-8')
2553
2555 parse = self.etree.parse
2556 # from file object
2557 f = open(fileInTestDir('test-string.xml'), 'r')
2558 tree = parse(f)
2559 f.close()
2560 self.assertXML(
2561 u'<a>Søk på nettet</a>'.encode('UTF-8'),
2562 tree.getroot(), 'UTF-8')
2563
2565 ElementTree = self.etree.ElementTree
2566 Element = self.etree.Element
2567
2568 a = Element('a')
2569 a.text = u'Søk på nettet'
2570
2571 f = StringIO()
2572 tree = ElementTree(element=a)
2573 tree.write(f, encoding='iso-8859-1')
2574 result = f.getvalue()
2575 declaration = "<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>"
2576 self.assertEncodingDeclaration(result,'iso-8859-1')
2577 result = result.split('?>', 1)[-1]
2578 if result[0] == '\n':
2579 result = result[1:]
2580 self.assertEquals(u'<a>Søk på nettet</a>'.encode('iso-8859-1'),
2581 result)
2582
2584 XMLParser = self.etree.XMLParser
2585
2586 text = u'Søk på nettet'
2587 xml_latin1 = (u'<a>%s</a>' % text).encode('iso-8859-1')
2588
2589 self.assertRaises(self.etree.ParseError,
2590 self.etree.parse,
2591 StringIO(xml_latin1))
2592
2593 tree = self.etree.parse(StringIO(xml_latin1),
2594 XMLParser(encoding="iso-8859-1"))
2595 a = tree.getroot()
2596 self.assertEquals(a.text, text)
2597
2599 XMLParser = self.etree.XMLParser
2600
2601 text = u'Søk på nettet'
2602 wrong_declaration = "<?xml version='1.0' encoding='UTF-8'?>"
2603 xml_latin1 = (u'%s<a>%s</a>' % (wrong_declaration, text)
2604 ).encode('iso-8859-1')
2605
2606 self.assertRaises(self.etree.ParseError,
2607 self.etree.parse,
2608 StringIO(xml_latin1))
2609
2610 tree = self.etree.parse(StringIO(xml_latin1),
2611 XMLParser(encoding="iso-8859-1"))
2612 a = tree.getroot()
2613 self.assertEquals(a.text, text)
2614
2616 # raise error on wrong encoding declaration in unicode strings
2617 XML = self.etree.XML
2618 test_utf = (u'<?xml version="1.0" encoding="iso-8859-1"?>' + \
2619 u'<a>Søk på nettet</a>')
2620 self.assertRaises(SyntaxError, XML, test_utf)
2621
2623 ElementTree = self.etree.ElementTree
2624 Element = self.etree.Element
2625
2626 a = Element('a')
2627 a.text = u'Søk på nettet'
2628
2629 f = StringIO()
2630 tree = ElementTree(element=a)
2631 tree.write(f)
2632 data = f.getvalue()
2633 self.assertEquals(
2634 u'<a>Søk på nettet</a>'.encode('ASCII', 'xmlcharrefreplace'),
2635 data)
2636
2638 Element = self.etree.Element
2639 tostring = self.etree.tostring
2640
2641 a = Element('a')
2642 a.text = u'Søk på nettet'
2643 self.assertEquals(u'<a>Søk på nettet</a>'.encode('UTF-8'),
2644 tostring(a, encoding='utf-8'))
2645
2647 Element = self.etree.Element
2648 tostring = self.etree.tostring
2649
2650 a = Element('a')
2651 a.text = u'Søk på nettet'
2652 self.assertRaises(LookupError, tostring, a,
2653 encoding='Invalid Encoding')
2654
2656 Element = self.etree.Element
2657 SubElement = self.etree.SubElement
2658 tostring = self.etree.tostring
2659
2660 a = Element('a')
2661 b = SubElement(a, 'b')
2662 b.text = u'Søk på nettet'
2663 self.assertEquals(u'<b>Søk på nettet</b>'.encode('UTF-8'),
2664 tostring(b, encoding='utf-8'))
2665
2667 Element = self.etree.Element
2668 SubElement = self.etree.SubElement
2669 tostring = self.etree.tostring
2670
2671 a = Element('a')
2672 b = SubElement(a, 'b')
2673 b.text = u'Søk på nettet'
2674 b.tail = u'Søk'
2675 self.assertEquals(u'<b>Søk på nettet</b>Søk'.encode('UTF-8'),
2676 tostring(b, encoding='utf-8'))
2677
2679 Element = self.etree.Element
2680 SubElement = self.etree.SubElement
2681 tostring = self.etree.tostring
2682
2683 a = Element('a')
2684 a.text = u'Søk på nettet'
2685
2686 expected = '<a>Søk på nettet</a>'
2687 self.assertEquals(
2688 expected,
2689 tostring(a))
2690
2692 Element = self.etree.Element
2693 SubElement = self.etree.SubElement
2694 tostring = self.etree.tostring
2695
2696 a = Element('a')
2697 b = SubElement(a, 'b')
2698 b.text = u'Søk på nettet'
2699
2700 expected = '<b>Søk på nettet</b>'
2701 self.assertEquals(
2702 expected,
2703 tostring(b))
2704
2706 utext = u'Søk på nettet'
2707 uxml = u'<p>%s</p>' % utext
2708 prologue = '<?xml version="1.0" encoding="iso-8859-1" ?>'
2709 isoxml = prologue + uxml.encode('iso-8859-1')
2710 tree = self.etree.XML(isoxml)
2711 self.assertEquals(utext, tree.text)
2712
2714 utext = u'Søk på nettet'
2715 uxml = u'<?xml version="1.0" encoding="UTF-8"?>' + \
2716 u'<p>%s</p>' % utext
2717 bom = '\xEF\xBB\xBF'
2718 xml = bom + uxml.encode("utf-8")
2719 tree = etree.XML(xml)
2720 self.assertEquals(utext, tree.text)
2721
2723 utext = u'Søk på nettet'
2724 uxml = u'<p>%s</p>' % utext
2725 prologue = '<?xml version="1.0" encoding="iso-8859-1" ?>'
2726 isoxml = prologue + uxml.encode('iso-8859-1')
2727 el = self.etree.parse(StringIO(isoxml)).getroot()
2728 self.assertEquals(utext, el.text)
2729
2731 Element = self.etree.Element
2732 ElementTree = self.etree.ElementTree
2733
2734 a = Element('a')
2735 a.text = "Foo"
2736 atree = ElementTree(a)
2737
2738 btree = copy.deepcopy(atree)
2739 self.assertEqual("Foo", atree.getroot().text)
2740 self.assertEqual("Foo", btree.getroot().text)
2741 self.assertFalse(btree is atree)
2742 self.assertFalse(btree.getroot() is atree.getroot())
2743
2745 Element = self.etree.Element
2746
2747 a = Element('a')
2748 a.text = 'Foo'
2749
2750 b = copy.deepcopy(a)
2751 self.assertEquals('Foo', b.text)
2752
2753 b.text = 'Bar'
2754 self.assertEquals('Bar', b.text)
2755 self.assertEquals('Foo', a.text)
2756
2757 del a
2758 self.assertEquals('Bar', b.text)
2759
2761 Element = self.etree.Element
2762
2763 a = Element('a')
2764 a.tail = 'Foo'
2765
2766 b = copy.deepcopy(a)
2767 self.assertEquals('Foo', b.tail)
2768
2769 b.tail = 'Bar'
2770 self.assertEquals('Bar', b.tail)
2771 self.assertEquals('Foo', a.tail)
2772
2773 del a
2774 self.assertEquals('Bar', b.tail)
2775
2777 Element = self.etree.Element
2778 SubElement = self.etree.SubElement
2779
2780 root = Element('root')
2781 a = SubElement(root, 'a')
2782 a.text = 'FooText'
2783 a.tail = 'FooTail'
2784
2785 b = copy.deepcopy(a)
2786 self.assertEquals('FooText', b.text)
2787 self.assertEquals('FooTail', b.tail)
2788
2789 b.text = 'BarText'
2790 b.tail = 'BarTail'
2791 self.assertEquals('BarTail', b.tail)
2792 self.assertEquals('FooTail', a.tail)
2793 self.assertEquals('BarText', b.text)
2794 self.assertEquals('FooText', a.text)
2795
2796 del a
2797 self.assertEquals('BarTail', b.tail)
2798 self.assertEquals('BarText', b.text)
2799
2801 root = self.etree.XML('''<doc xmlns="dns" xmlns:t="tns">
2802 <parent><node t:foo="bar" /></parent>
2803 </doc>''')
2804 self.assertEquals(
2805 root[0][0].get('{tns}foo'),
2806 copy.deepcopy(root[0])[0].get('{tns}foo') )
2807 self.assertEquals(
2808 root[0][0].get('{tns}foo'),
2809 copy.deepcopy(root[0][0]).get('{tns}foo') )
2810
2812 # previously caused a crash
2813 Element = self.etree.Element
2814 tostring = self.etree.tostring
2815
2816 a = Element('a')
2817 b = copy.deepcopy(a)
2818 a.append( Element('C') )
2819 b.append( Element('X') )
2820
2821 self.assertEquals('<a><C/></a>',
2822 tostring(a).replace(' ', ''))
2823 self.assertEquals('<a><X/></a>',
2824 tostring(b).replace(' ', ''))
2825
2827 Element = self.etree.Element
2828
2829 a = Element('a')
2830 a.text = 'Foo'
2831
2832 b = copy.copy(a)
2833 self.assertEquals('Foo', b.text)
2834
2835 b.text = 'Bar'
2836 self.assertEquals('Bar', b.text)
2837 self.assertEquals('Foo', a.text)
2838 # XXX ElementTree will share nodes, but lxml.etree won't..
2839
2841 Element = self.etree.Element
2842 ElementTree = self.etree.ElementTree
2843
2844 a = Element('a')
2845 a.text = 'Foo'
2846 atree = ElementTree(a)
2847
2848 btree = copy.copy(atree)
2849 self.assertFalse(btree is atree)
2850 self.assert_(btree.getroot() is atree.getroot())
2851 self.assertEquals('Foo', atree.getroot().text)
2852
2854 # deprecated as of ET 1.3/lxml 2.0
2855 etree = self.etree
2856 e = etree.Element('foo')
2857 self.assertEquals(False, bool(e))
2858 etree.SubElement(e, 'bar')
2859 self.assertEquals(True, bool(e))
2860 e = etree.Element('foo')
2861 e.text = 'hey'
2862 self.assertEquals(False, bool(e))
2863 e = etree.Element('foo')
2864 e.tail = 'bar'
2865 self.assertEquals(False, bool(e))
2866 e = etree.Element('foo')
2867 e.set('bar', 'Bar')
2868 self.assertEquals(False, bool(e))
2869
2871 etree = self.etree
2872
2873 a = etree.Element('a')
2874 b = etree.SubElement(a, 'b')
2875
2876 t = etree.ElementTree(a)
2877 self.assertEquals(self._rootstring(t), '<a><b/></a>')
2878
2879 t1 = etree.ElementTree(a)
2880 self.assertEquals(self._rootstring(t1), '<a><b/></a>')
2881 self.assertEquals(self._rootstring(t), '<a><b/></a>')
2882
2883 t2 = etree.ElementTree(b)
2884 self.assertEquals(self._rootstring(t2), '<b/>')
2885 self.assertEquals(self._rootstring(t1), '<a><b/></a>')
2886 self.assertEquals(self._rootstring(t), '<a><b/></a>')
2887
2889 etree = self.etree
2890 qname = etree.QName('myns', 'a')
2891 a1 = etree.Element(qname)
2892 a2 = etree.SubElement(a1, qname)
2893 self.assertEquals(a1.tag, "{myns}a")
2894 self.assertEquals(a2.tag, "{myns}a")
2895
2897 etree = self.etree
2898 qname1 = etree.QName('myns', 'a')
2899 qname2 = etree.QName('myns', 'a')
2900 self.assertEquals(qname1, "{myns}a")
2901 self.assertEquals("{myns}a", qname2)
2902 self.assertEquals(qname1, qname1)
2903 self.assertEquals(qname1, qname2)
2904
2906 etree = self.etree
2907 qname = etree.QName('myns', 'a')
2908
2909 a = etree.Element(qname)
2910 a.set(qname, "value")
2911
2912 self.assertEquals(a.get(qname), "value")
2913 self.assertEquals(a.get("{myns}a"), "value")
2914
2916 etree = self.etree
2917 qname = etree.QName('myns', 'a')
2918
2919 a = etree.Element(qname)
2920 a.attrib[qname] = "value"
2921
2922 self.assertEquals(a.attrib[qname], "value")
2923 self.assertEquals(a.attrib.get(qname), "value")
2924
2925 self.assertEquals(a.attrib["{myns}a"], "value")
2926 self.assertEquals(a.attrib.get("{myns}a"), "value")
2927
2929 etree = self.etree
2930 qname = etree.QName('http://myns', 'a')
2931 a = etree.Element(qname)
2932 a.set(qname, qname)
2933
2934 self.assertXML(
2935 '<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>',
2936 a)
2937
2939 etree = self.etree
2940 qname = etree.QName('http://myns', 'a')
2941 a = etree.Element('a')
2942 a.set('a', qname)
2943
2944 self.assertXML(
2945 '<a xmlns:ns0="http://myns" a="ns0:a"></a>',
2946 a)
2947
2949 etree = self.etree
2950 qname = etree.QName('http://myns', 'a')
2951 a = etree.Element(qname)
2952 a.attrib[qname] = qname
2953
2954 self.assertXML(
2955 '<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>',
2956 a)
2957
2959 etree = self.etree
2960 parser = etree.XMLParser()
2961 if hasattr(parser, "version"):
2962 # ElementTree 1.3+, cET
2963 self.assert_(re.match("[^ ]+ [0-9.]+", parser.version))
2964
2965 # feed parser interface
2966
2968 parser = self.etree.XMLParser()
2969
2970 parser.feed('<?xml version=')
2971 parser.feed('"1.0"?><ro')
2972 parser.feed('ot><')
2973 parser.feed('a test="works"/')
2974 parser.feed('></root')
2975 parser.feed('>')
2976
2977 root = parser.close()
2978
2979 self.assertEquals(root.tag, "root")
2980 self.assertEquals(root[0].tag, "a")
2981 self.assertEquals(root[0].get("test"), "works")
2982
2984 ParseError = self.etree.ParseError
2985 parser = self.etree.XMLParser()
2986 self.assertRaises(ParseError, parser.close)
2987
2989 ParseError = self.etree.ParseError
2990 parser = self.etree.XMLParser()
2991
2992 parser.feed('<?xml version=')
2993 parser.feed('"1.0"?><ro')
2994
2995 self.assertRaises(ParseError, parser.close)
2996
2998 ParseError = self.etree.ParseError
2999 parser = self.etree.XMLParser()
3000
3001 parser.feed('<?xml version=')
3002 parser.feed('"1.0"?><ro')
3003 try:
3004 parser.feed('<><><><><><><')
3005 except ParseError:
3006 # can raise, but not required before close()
3007 pass
3008
3009 self.assertRaises(ParseError, parser.close)
3010
3011 # parser target interface
3012
3014 assertEquals = self.assertEquals
3015 assertFalse = self.assertFalse
3016
3017 events = []
3018 class Target(object):
3019 def start(self, tag, attrib):
3020 events.append("start")
3021 assertFalse(attrib)
3022 assertEquals("TAG", tag)
3023 def end(self, tag):
3024 events.append("end")
3025 assertEquals("TAG", tag)
3026 def close(self):
3027 return "DONE"
3028
3029 parser = self.etree.XMLParser(target=Target())
3030
3031 parser.feed("<TAG/>")
3032 done = parser.close()
3033
3034 self.assertEquals("DONE", done)
3035 self.assertEquals(["start", "end"], events)
3036
3038 assertEquals = self.assertEquals
3039
3040 events = []
3041 class Target(object):
3042 def start(self, tag, attrib):
3043 events.append("start-" + tag)
3044 for name, value in attrib.iteritems():
3045 assertEquals(tag + name, value)
3046 def end(self, tag):
3047 events.append("end-" + tag)
3048 def close(self):
3049 return "DONE"
3050
3051 parser = self.etree.XMLParser(target=Target())
3052
3053 parser.feed('<root a="roota" b="rootb"><sub c="subc"/></root>')
3054 done = parser.close()
3055
3056 self.assertEquals("DONE", done)
3057 self.assertEquals(["start-root", "start-sub", "end-sub", "end-root"],
3058 events)
3059
3061 events = []
3062 class Target(object):
3063 def start(self, tag, attrib):
3064 events.append("start-" + tag)
3065 def end(self, tag):
3066 events.append("end-" + tag)
3067 def data(self, data):
3068 events.append("data-" + data)
3069 def close(self):
3070 return "DONE"
3071
3072 parser = self.etree.XMLParser(target=Target())
3073
3074 parser.feed('<root>A<sub/>B</root>')
3075 done = parser.close()
3076
3077 self.assertEquals("DONE", done)
3078 self.assertEquals(["start-root", "data-A", "start-sub",
3079 "end-sub", "data-B", "end-root"],
3080 events)
3081
3083 builder = self.etree.TreeBuilder()
3084 el = builder.start("root", {'a':'A', 'b':'B'})
3085 self.assertEquals("root", el.tag)
3086 self.assertEquals({'a':'A', 'b':'B'}, el.attrib)
3087 builder.data("ROOTTEXT")
3088 el = builder.start("child", {'x':'X', 'y':'Y'})
3089 self.assertEquals("child", el.tag)
3090 self.assertEquals({'x':'X', 'y':'Y'}, el.attrib)
3091 builder.data("CHILDTEXT")
3092 el = builder.end("child")
3093 self.assertEquals("child", el.tag)
3094 self.assertEquals({'x':'X', 'y':'Y'}, el.attrib)
3095 self.assertEquals("CHILDTEXT", el.text)
3096 self.assertEquals(None, el.tail)
3097 builder.data("CHILDTAIL")
3098 root = builder.end("root")
3099
3100 self.assertEquals("root", root.tag)
3101 self.assertEquals("ROOTTEXT", root.text)
3102 self.assertEquals("CHILDTEXT", root[0].text)
3103 self.assertEquals("CHILDTAIL", root[0].tail)
3104
3106 parser = self.etree.XMLParser(target=self.etree.TreeBuilder())
3107 parser.feed('<root>ROOTTEXT<child>CHILDTEXT</child>CHILDTAIL</root>')
3108 root = parser.close()
3109
3110 self.assertEquals("root", root.tag)
3111 self.assertEquals("ROOTTEXT", root.text)
3112 self.assertEquals("CHILDTEXT", root[0].text)
3113 self.assertEquals("CHILDTAIL", root[0].tail)
3114
3115 # helper methods
3116
3118 """Write out element for comparison.
3119 """
3120 data = self.etree.tostring(element, encoding=encoding)
3121 if encoding != 'us-ascii':
3122 data = unicode(data, encoding)
3123 return canonicalize(data)
3124
3126 """Write out element for comparison, using real file.
3127 """
3128 ElementTree = self.etree.ElementTree
3129 handle, filename = tempfile.mkstemp()
3130 try:
3131 f = open(filename, 'wb')
3132 tree = ElementTree(element=element)
3133 tree.write(f, encoding=encoding)
3134 f.close()
3135 f = open(filename, 'rb')
3136 data = f.read()
3137 f.close()
3138 finally:
3139 os.close(handle)
3140 os.remove(filename)
3141 if encoding != 'us-ascii':
3142 data = unicode(data, encoding)
3143 return canonicalize(data)
3144
3146 """Writes element out and checks whether it is expected.
3147
3148 Does this two ways; once using StringIO, once using a real file.
3149 """
3150 self.assertEquals(expected, self._writeElement(element, encoding))
3151 self.assertEquals(expected, self._writeElementFile(element, encoding))
3152
3154 "Checks if the result XML byte string specifies the encoding."
3155 has_encoding = re.compile(r"<\?xml[^>]+ encoding=[\"']([^\"']+)[\"']").match
3156 self.assert_(has_encoding(result))
3157 result_encoding = has_encoding(result).group(1)
3158 self.assertEquals(result_encoding.upper(), encoding.upper())
3159
3162
3165
3167 self.assert_(hasattr(element, 'tag'))
3168 self.assert_(hasattr(element, 'attrib'))
3169 self.assert_(hasattr(element, 'text'))
3170 self.assert_(hasattr(element, 'tail'))
3171 self._check_string(element.tag)
3172 self._check_mapping(element.attrib)
3173 if element.text != None:
3174 self._check_string(element.text)
3175 if element.tail != None:
3176 self._check_string(element.tail)
3177
3179 len(string)
3180 for char in string:
3181 self.assertEquals(1, len(char))
3182 new_string = string + ""
3183 new_string = string + " "
3184 string[:0]
3185
3187 len(mapping)
3188 keys = mapping.keys()
3189 items = mapping.items()
3190 for key in keys:
3191 item = mapping[key]
3192 mapping["key"] = "value"
3193 self.assertEquals("value", mapping["key"])
3194
3195 # assertFalse doesn't exist in Python 2.3
3196 try:
3197 unittest.TestCase.assertFalse
3198 except AttributeError:
3199 assertFalse = unittest.TestCase.failIf
3200
3201
3202 if etree:
3205
3206 if ElementTree:
3209
3210 if cElementTree:
3213
3215 suite = unittest.TestSuite()
3216 if etree:
3217 suite.addTests([unittest.makeSuite(ETreeTestCase)])
3218 if ElementTree:
3219 suite.addTests([unittest.makeSuite(ElementTreeTestCase)])
3220 if cElementTree:
3221 suite.addTests([unittest.makeSuite(CElementTreeTestCase)])
3222 return suite
3223
3224 if __name__ == '__main__':
3225 print 'to test use test.py %s' % __file__
3226
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0beta1 on Sun Nov 25 11:48:48 2007 | http://epydoc.sourceforge.net |