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, shutil, tempfile, copy, operator 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 2123 etree = None 24 27 30 33 3723139 Element = self.etree.Element 40 ElementTree = self.etree.ElementTree 41 42 element = Element('top') 43 tree = ElementTree(element) 44 self.buildNodes(element, 10, 3) 45 f = open(self.getTestFilePath('testdump.xml'), 'w') 46 tree.write(f, 'UTF-8') 47 f.close() 48 f = open(self.getTestFilePath('testdump.xml'), 'r') 49 tree = ElementTree(file=f) 50 f.close() 51 f = open(self.getTestFilePath('testdump2.xml'), 'w') 52 tree.write(f, 'UTF-8') 53 f.close() 54 f = open(self.getTestFilePath('testdump.xml'), 'r') 55 data1 = f.read() 56 f.close() 57 f = open(self.getTestFilePath('testdump2.xml'), 'r') 58 data2 = f.read() 59 f.close() 60 self.assertEquals(data1, data2)6163 Element = self.etree.Element 64 65 if depth == 0: 66 return 67 for i in range(children): 68 new_element = Element('element_%s_%s' % (depth, i)) 69 self.buildNodes(new_element, children, depth - 1) 70 element.append(new_element)7173 Element = self.etree.Element 74 75 root = Element('root') 76 root.append(Element('one')) 77 root.append(Element('two')) 78 root.append(Element('three')) 79 self.assertEquals(3, len(root)) 80 self.assertEquals('one', root[0].tag) 81 self.assertEquals('two', root[1].tag) 82 self.assertEquals('three', root[2].tag) 83 self.assertRaises(IndexError, operator.getitem, root, 3)8486 Element = self.etree.Element 87 SubElement = self.etree.SubElement 88 89 root = Element('root') 90 SubElement(root, 'one') 91 SubElement(root, 'two') 92 SubElement(root, 'three') 93 self.assertEquals(3, len(root)) 94 self.assertEquals('one', root[0].tag) 95 self.assertEquals('two', root[1].tag) 96 self.assertEquals('three', root[2].tag)9799 Element = self.etree.Element 100 SubElement = self.etree.SubElement 101 102 root1 = Element('root') 103 SubElement(root1, 'one') 104 self.assert_(root1[0] in root1) 105 106 root2 = Element('root') 107 SubElement(root2, 'two') 108 SubElement(root2, 'three') 109 self.assert_(root2[0] in root2) 110 self.assert_(root2[1] in root2) 111 112 self.assertFalse(root1[0] in root2) 113 self.assertFalse(root2[0] in root1) 114 self.assertFalse(None in root2)115117 ElementTree = self.etree.ElementTree 118 119 f = StringIO('<doc>Test<one>One</one></doc>') 120 doc = ElementTree(file=f) 121 root = doc.getroot() 122 self.assertEquals(1, len(root)) 123 self.assertEquals('one', root[0].tag) 124 self.assertRaises(IndexError, operator.getitem, root, 1)125127 ElementTree = self.etree.ElementTree 128 129 f = StringIO('<doc><one>One</one><two>Two</two>hm<three>Three</three></doc>') 130 doc = ElementTree(file=f) 131 root = doc.getroot() 132 self.assertEquals(3, len(root)) 133 self.assertEquals('one', root[0].tag) 134 self.assertEquals('two', root[1].tag) 135 self.assertEquals('three', root[2].tag)136138 ElementTree = self.etree.ElementTree 139 140 f = StringIO('<doc>Test</doc>') 141 doc = ElementTree(file=f) 142 root = doc.getroot() 143 self.assertEquals(0, len(root))144146 Element = self.etree.Element 147 SubElement = self.etree.SubElement 148 a = Element('a') 149 b = SubElement(a, 'b') 150 c = SubElement(a, 'c') 151 d = SubElement(a, 'd') 152 self.assertEquals(d, a[-1]) 153 self.assertEquals(c, a[-2]) 154 self.assertEquals(b, a[-3]) 155 self.assertRaises(IndexError, operator.getitem, a, -4) 156 a[-1] = e = Element('e') 157 self.assertEquals(e, a[-1]) 158 del a[-1] 159 self.assertEquals(2, len(a))160162 ElementTree = self.etree.ElementTree 163 164 f = StringIO('<doc><one>One</one><two>Two</two></doc>') 165 doc = ElementTree(file=f) 166 root = doc.getroot() 167 self.assertEquals(2, len(root)) 168 self.assertEquals('one', root[0].tag) 169 self.assertEquals('two', root[1].tag)170172 ElementTree = self.etree.ElementTree 173 174 f = StringIO('<doc>This is a text</doc>') 175 doc = ElementTree(file=f) 176 root = doc.getroot() 177 self.assertEquals('This is a text', root.text)178180 ElementTree = self.etree.ElementTree 181 182 f = StringIO('<doc></doc>') 183 doc = ElementTree(file=f) 184 root = doc.getroot() 185 self.assertEquals(None, root.text)186188 ElementTree = self.etree.ElementTree 189 190 f = StringIO('<doc><one>One</one></doc>') 191 doc = ElementTree(file=f) 192 root = doc.getroot() 193 self.assertEquals(None, root.text) 194 self.assertEquals('One', root[0].text)195197 ElementTree = self.etree.ElementTree 198 199 f = StringIO('<doc>This is > than a text</doc>') 200 doc = ElementTree(file=f) 201 root = doc.getroot() 202 self.assertEquals('This is > than a text', root.text)203205 Element = self.etree.Element 206 207 a = Element("a") 208 a.text = "<>&" 209 self.assertXML('<a><>&</a>', 210 a)211213 tostring = self.etree.tostring 214 Element = self.etree.Element 215 216 a = Element("a") 217 a.text = "<>&" 218 self.assertEquals('<a><>&</a>', 219 tostring(a))220 226 227 a = Element("a") 228 a.text = strTest("text") 229 self.assertXML('<a>text</a>', 230 a)233 ElementTree = self.etree.ElementTree 234 235 f = StringIO('<doc>This is <i>mixed</i> content.</doc>') 236 doc = ElementTree(file=f) 237 root = doc.getroot() 238 self.assertEquals(1, len(root)) 239 self.assertEquals('This is ', root.text) 240 self.assertEquals(None, root.tail) 241 self.assertEquals('mixed', root[0].text) 242 self.assertEquals(' content.', root[0].tail)243245 Element = self.etree.Element 246 SubElement = self.etree.SubElement 247 248 class strTest(str): 249 pass250 251 a = Element("a") 252 SubElement(a, "t").tail = strTest("tail") 253 self.assertXML('<a><t></t>tail</a>', 254 a) 255257 Element = self.etree.Element 258 ElementTree = self.etree.ElementTree 259 260 el = Element('hoi') 261 doc = ElementTree(el) 262 root = doc.getroot() 263 self.assertEquals(None, root.text) 264 self.assertEquals('hoi', root.tag)265267 ElementTree = self.etree.ElementTree 268 269 f = StringIO('<doc one="One" two="Two"/>') 270 doc = ElementTree(file=f) 271 root = doc.getroot() 272 self.assertEquals('One', root.attrib['one']) 273 self.assertEquals('Two', root.attrib['two']) 274 self.assertRaises(KeyError, operator.getitem, root.attrib, 'three')275277 ElementTree = self.etree.ElementTree 278 279 f = StringIO('<doc one="One" two="Two"/>') 280 doc = ElementTree(file=f) 281 root = doc.getroot() 282 self.assertEquals('One', root.attrib.get('one')) 283 self.assertEquals('Two', root.attrib.get('two')) 284 self.assertEquals(None, root.attrib.get('three')) 285 self.assertEquals('foo', root.attrib.get('three', 'foo'))286288 ElementTree = self.etree.ElementTree 289 290 f = StringIO('<doc one="One" two="Two"/>') 291 doc = ElementTree(file=f) 292 root = doc.getroot() 293 self.assertEquals('One', root.get('one')) 294 self.assertEquals('Two', root.get('two')) 295 self.assertEquals(None, root.get('three')) 296 self.assertEquals('foo', root.get('three', 'foo'))297299 XML = self.etree.XML 300 301 root = XML('<doc one="One" two="Two"/>') 302 self.assertEquals('One', root.get('one')) 303 self.assertEquals('Two', root.get('two')) 304 root.attrib.clear() 305 self.assertEquals(None, root.get('one')) 306 self.assertEquals(None, root.get('two'))307309 Element = self.etree.Element 310 311 root = Element("root", one="One") 312 root.set("two", "Two") 313 self.assertEquals('One', root.get('one')) 314 self.assertEquals('Two', root.get('two')) 315 root.attrib.clear() 316 self.assertEquals(None, root.get('one')) 317 self.assertEquals(None, root.get('two'))318320 XML = self.etree.XML 321 322 root = XML('<doc alpha="Alpha" beta="Beta"/>') 323 items = root.attrib.items() 324 items.sort() 325 self.assertEquals( 326 [('alpha', 'Alpha'), ('beta', 'Beta')], 327 items) 328 329 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}) 330 331 items = root.attrib.items() 332 items.sort() 333 self.assertEquals( 334 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')], 335 items)336338 XML = self.etree.XML 339 340 root = XML('<doc alpha="Alpha" beta="Beta"/>') 341 items = root.attrib.items() 342 items.sort() 343 self.assertEquals( 344 [('alpha', 'Alpha'), ('beta', 'Beta')], 345 items) 346 347 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.items()) 348 349 items = root.attrib.items() 350 items.sort() 351 self.assertEquals( 352 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')], 353 items)354356 XML = self.etree.XML 357 358 root = XML('<doc alpha="Alpha" beta="Beta"/>') 359 items = root.attrib.items() 360 items.sort() 361 self.assertEquals( 362 [('alpha', 'Alpha'), ('beta', 'Beta')], 363 items) 364 365 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.iteritems()) 366 367 items = root.attrib.items() 368 items.sort() 369 self.assertEquals( 370 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')], 371 items)372374 XML = self.etree.XML 375 376 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>') 377 keys = root.attrib.keys() 378 keys.sort() 379 self.assertEquals(['alpha', 'beta', 'gamma'], keys)380382 XML = self.etree.XML 383 384 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>') 385 keys = root.keys() 386 keys.sort() 387 self.assertEquals(['alpha', 'beta', 'gamma'], keys)388390 XML = self.etree.XML 391 392 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>') 393 items = root.items() 394 items.sort() 395 self.assertEquals( 396 [('alpha','Alpha'), ('beta','Beta'), ('gamma','Gamma')], 397 items)398400 XML = self.etree.XML 401 402 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />') 403 keys = root.keys() 404 keys.sort() 405 self.assertEquals(['bar', '{http://ns.codespeak.net/test}baz'], 406 keys)407409 XML = self.etree.XML 410 411 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>') 412 values = root.attrib.values() 413 values.sort() 414 self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)415417 XML = self.etree.XML 418 419 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />') 420 values = root.attrib.values() 421 values.sort() 422 self.assertEquals( 423 ['Bar', 'Baz'], values)424426 XML = self.etree.XML 427 428 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>') 429 items = root.attrib.items() 430 items.sort() 431 self.assertEquals([ 432 ('alpha', 'Alpha'), 433 ('beta', 'Beta'), 434 ('gamma', 'Gamma'), 435 ], 436 items)437439 XML = self.etree.XML 440 441 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />') 442 items = root.attrib.items() 443 items.sort() 444 self.assertEquals( 445 [('bar', 'Bar'), ('{http://ns.codespeak.net/test}baz', 'Baz')], 446 items)447449 XML = self.etree.XML 450 451 expected = "{'{http://ns.codespeak.net/test}baz': 'Baz', 'bar': 'Bar'}" 452 alternative = "{'bar': 'Bar', '{http://ns.codespeak.net/test}baz': 'Baz'}" 453 454 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />') 455 try: 456 self.assertEquals(expected, str(root.attrib)) 457 except AssertionError: 458 self.assertEquals(alternative, str(root.attrib))459461 XML = self.etree.XML 462 463 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />') 464 self.assertEquals( 465 True, root.attrib.has_key('bar')) 466 self.assertEquals( 467 False, root.attrib.has_key('baz')) 468 self.assertEquals( 469 False, root.attrib.has_key('hah')) 470 self.assertEquals( 471 True, 472 root.attrib.has_key('{http://ns.codespeak.net/test}baz'))473475 XML = self.etree.XML 476 477 root = XML('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />') 478 self.assertEquals( 479 True, 'bar' in root.attrib) 480 self.assertEquals( 481 False, 'baz' in root.attrib) 482 self.assertEquals( 483 False, 'hah' in root.attrib) 484 self.assertEquals( 485 True, 486 '{http://ns.codespeak.net/test}baz' in root.attrib)487489 Element = self.etree.Element 490 491 root = Element("root") 492 root.set("attr", "TEST") 493 self.assertEquals("TEST", root.get("attr"))494496 XML = self.etree.XML 497 498 root = XML('<doc>This is a text.</doc>') 499 self.assertEquals(0, len(root)) 500 self.assertEquals('This is a text.', root.text)501503 XMLID = self.etree.XMLID 504 XML = self.etree.XML 505 xml_text = ''' 506 <document> 507 <h1 id="chapter1">...</h1> 508 <p id="note1" class="note">...</p> 509 <p>Regular paragraph.</p> 510 <p xml:id="xmlid">XML:ID paragraph.</p> 511 <p id="warn1" class="warning">...</p> 512 </document> 513 ''' 514 515 root, dic = XMLID(xml_text) 516 root2 = XML(xml_text) 517 self.assertEquals(self._writeElement(root), 518 self._writeElement(root2)) 519 expected = { 520 "chapter1" : root[0], 521 "note1" : root[1], 522 "warn1" : root[4] 523 } 524 self.assertEquals(dic, expected)525527 fromstring = self.etree.fromstring 528 529 root = fromstring('<doc>This is a text.</doc>') 530 self.assertEquals(0, len(root)) 531 self.assertEquals('This is a text.', root.text)532534 fromstringlist = self.etree.fromstringlist 535 536 root = fromstringlist(["<do", "c>T", "hi", "s is", 537 " a text.<", "/doc", ">"]) 538 self.assertEquals(0, len(root)) 539 self.assertEquals('This is a text.', root.text)540542 fromstringlist = self.etree.fromstringlist 543 544 root = fromstringlist(list('<doc>This is a text.</doc>')) 545 self.assertEquals(0, len(root)) 546 self.assertEquals('This is a text.', root.text)547549 fromstringlist = self.etree.fromstringlist 550 551 root = fromstringlist(['<doc>This is a text.</doc>']) 552 self.assertEquals(0, len(root)) 553 self.assertEquals('This is a text.', root.text)554556 iselement = self.etree.iselement 557 Element = self.etree.Element 558 ElementTree = self.etree.ElementTree 559 XML = self.etree.XML 560 Comment = self.etree.Comment 561 ProcessingInstruction = self.etree.ProcessingInstruction 562 563 el = Element('hoi') 564 self.assert_(iselement(el)) 565 566 el2 = XML('<foo/>') 567 self.assert_(iselement(el2)) 568 569 tree = ElementTree(element=Element('dag')) 570 self.assert_(not iselement(tree)) 571 self.assert_(iselement(tree.getroot())) 572 573 c = Comment('test') 574 self.assert_(iselement(c)) 575 576 p = ProcessingInstruction("test", "some text") 577 self.assert_(iselement(p))578580 XML = self.etree.XML 581 582 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>') 583 result = [] 584 for el in root: 585 result.append(el.tag) 586 self.assertEquals(['one', 'two', 'three'], result)587589 XML = self.etree.XML 590 591 root = XML('<doc></doc>') 592 result = [] 593 for el in root: 594 result.append(el.tag) 595 self.assertEquals([], result)596598 XML = self.etree.XML 599 600 root = XML('<doc>Text</doc>') 601 result = [] 602 for el in root: 603 result.append(el.tag) 604 self.assertEquals([], result)605607 # this would cause a crash in the past 608 fromstring = self.etree.fromstring 609 root = etree.fromstring('<html><p></p>x</html>') 610 for elem in root: 611 elem.tail = ''612614 XML = self.etree.XML 615 616 try: 617 reversed(()) 618 except NameError: 619 # before Python 2.4 620 return 621 622 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>') 623 result = [] 624 for el in reversed(root): 625 result.append(el.tag) 626 self.assertEquals(['three', 'two', 'one'], result)627629 XML = self.etree.XML 630 631 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>') 632 result = [] 633 add = True 634 for el in root: 635 result.append(el.tag) 636 if add: 637 self.etree.SubElement(root, 'four') 638 add = False 639 self.assertEquals(['one', 'two', 'three', 'four'], result)640642 XML = self.etree.XML 643 644 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>') 645 result = [] 646 for el in root: 647 result.append(el.tag) 648 del root[-1] 649 self.assertEquals(['one', 'two'], result)650652 XML = self.etree.XML 653 654 root = XML('<doc><one/><two/></doc>') 655 result = [] 656 for el0 in root: 657 result.append(el0.tag) 658 for el1 in root: 659 result.append(el1.tag) 660 self.assertEquals(['one','one', 'two', 'two', 'one', 'two'], result)661663 XML = self.etree.XML 664 665 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma" />') 666 result = [] 667 for key in root.attrib: 668 result.append(key) 669 result.sort() 670 self.assertEquals(['alpha', 'beta', 'gamma'], result)671673 XML = self.etree.XML 674 root = XML('<a><b><c/></b><b/><c><b/></c></a>') 675 self.assertEquals(len(list(root.findall("c"))), 1) 676 self.assertEquals(len(list(root.findall(".//c"))), 2) 677 self.assertEquals(len(list(root.findall(".//b"))), 3) 678 self.assertEquals(len(list(root.findall(".//b"))[0]), 1) 679 self.assertEquals(len(list(root.findall(".//b"))[1]), 0) 680 self.assertEquals(len(list(root.findall(".//b"))[2]), 0)681683 XML = self.etree.XML 684 root = XML('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>') 685 self.assertEquals(len(list(root.findall(".//{X}b"))), 2) 686 self.assertEquals(len(list(root.findall(".//b"))), 3) 687 self.assertEquals(len(list(root.findall("b"))), 2)688690 Element = self.etree.Element 691 692 el = Element('tag', foo='Foo', bar='Bar') 693 self.assertEquals('Foo', el.attrib['foo']) 694 self.assertEquals('Bar', el.attrib['bar'])695697 Element = self.etree.Element 698 699 el = Element('tag', {'foo':'Foo', 'bar':'Bar'}) 700 self.assertEquals('Foo', el.attrib['foo']) 701 self.assertEquals('Bar', el.attrib['bar'])702704 Element = self.etree.Element 705 706 el = Element('tag', {'{ns1}foo':'Foo', '{ns2}bar':'Bar'}) 707 self.assertEquals('Foo', el.attrib['{ns1}foo']) 708 self.assertEquals('Bar', el.attrib['{ns2}bar'])709711 Element = self.etree.Element 712 SubElement = self.etree.SubElement 713 714 el = Element('tag') 715 SubElement(el, 'foo', {'foo':'Foo'}, baz="Baz") 716 self.assertEquals("Baz", el[0].attrib['baz']) 717 self.assertEquals('Foo', el[0].attrib['foo'])718720 Element = self.etree.Element 721 SubElement = self.etree.SubElement 722 723 el = Element('tag') 724 SubElement(el, 'foo', {'{ns1}foo':'Foo', '{ns2}bar':'Bar'}) 725 self.assertEquals('Foo', el[0].attrib['{ns1}foo']) 726 self.assertEquals('Bar', el[0].attrib['{ns2}bar'])727729 ElementTree = self.etree.ElementTree 730 XML = self.etree.XML 731 732 for i in range(10): 733 f = StringIO() 734 root = XML('<doc%s>This is a test.</doc%s>' % (i, i)) 735 tree = ElementTree(element=root) 736 tree.write(f) 737 data = f.getvalue() 738 self.assertEquals( 739 '<doc%s>This is a test.</doc%s>' % (i, i), 740 canonicalize(data))741743 ElementTree = self.etree.ElementTree 744 Element = self.etree.Element 745 SubElement = self.etree.SubElement 746 747 html = Element('html') 748 body = SubElement(html, 'body') 749 p = SubElement(body, 'p') 750 p.text = "html" 751 SubElement(p, 'br').tail = "test" 752 753 tree = ElementTree(element=html) 754 f = StringIO() 755 tree.write(f, method="html") 756 data = f.getvalue() 757 758 self.assertEquals('<html><body><p>html<br>test</p></body></html>', 759 data)760762 ElementTree = self.etree.ElementTree 763 Element = self.etree.Element 764 SubElement = self.etree.SubElement 765 766 a = Element('a') 767 a.text = "A" 768 a.tail = "tail" 769 b = SubElement(a, 'b') 770 b.text = "B" 771 b.tail = "TAIL" 772 c = SubElement(a, 'c') 773 c.text = "C" 774 775 tree = ElementTree(element=a) 776 f = StringIO() 777 tree.write(f, method="text") 778 data = f.getvalue() 779 780 self.assertEquals('ABTAILCtail', 781 data)782784 ElementTree = self.etree.ElementTree 785 XML = self.etree.XML 786 787 tree = ElementTree( XML('<doc>This is a test.</doc>') ) 788 self.assertRaises(IOError, tree.write, 789 "definitely////\\-\\nonexisting\\-\\////FILE")790 791 # this could trigger a crash, apparently because the document 792 # reference was prematurely garbage collected794 Element = self.etree.Element 795 796 element = Element('tag') 797 for i in range(10): 798 element.attrib['key'] = 'value' 799 value = element.attrib['key'] 800 self.assertEquals(value, 'value')801 802 # from doctest; for some reason this caused crashes too804 Element = self.etree.Element 805 ElementTree = self.etree.ElementTree 806 807 f = StringIO() 808 for i in range(10): 809 element = Element('tag%s' % i) 810 self._check_element(element) 811 tree = ElementTree(element) 812 tree.write(f) 813 self._check_element_tree(tree)814816 Element = self.etree.Element 817 SubElement = self.etree.SubElement 818 819 el = Element('foo') 820 el2 = SubElement(el, 'bar') 821 el3 = SubElement(el2, 'baz') 822 823 al = Element('foo2') 824 al2 = SubElement(al, 'bar2') 825 al3 = SubElement(al2, 'baz2') 826 827 # now move al2 into el 828 el.append(al2) 829 830 # now change al3 directly 831 al3.text = 'baz2-modified' 832 833 # it should have changed through this route too 834 self.assertEquals( 835 'baz2-modified', 836 el[1][0].text)837839 Element = self.etree.Element 840 SubElement = self.etree.SubElement 841 842 a = Element('a') 843 b = SubElement(a, 'b') 844 a.text = 'hoi' 845 self.assertEquals( 846 'hoi', 847 a.text) 848 self.assertEquals( 849 'b', 850 a[0].tag)851853 Element = self.etree.Element 854 SubElement = self.etree.SubElement 855 856 a = Element('a') 857 a.text = 'hoi' 858 b = SubElement(a ,'b') 859 self.assertEquals( 860 'hoi', 861 a.text) 862 self.assertEquals( 863 'b', 864 a[0].tag)865867 Element = self.etree.Element 868 869 a = Element('a') 870 871 a.text = 'foo' 872 a.text = None 873 874 self.assertEquals( 875 None, 876 a.text) 877 self.assertXML('<a></a>', a)878880 Element = self.etree.Element 881 882 a = Element('a') 883 self.assertEquals(None, a.text) 884 885 a.text = '' 886 self.assertEquals('', a.text) 887 self.assertXML('<a></a>', a)888890 Element = self.etree.Element 891 SubElement = self.etree.SubElement 892 893 a = Element('a') 894 a.tail = 'dag' 895 self.assertEquals('dag', 896 a.tail) 897 b = SubElement(a, 'b') 898 b.tail = 'hoi' 899 self.assertEquals('hoi', 900 b.tail) 901 self.assertEquals('dag', 902 a.tail)903905 Element = self.etree.Element 906 907 a = Element('a') 908 b = Element('b') 909 b.tail = 'b_tail' 910 a.append(b) 911 self.assertEquals('b_tail', 912 b.tail)913915 Element = self.etree.Element 916 SubElement = self.etree.SubElement 917 918 a = Element('a') 919 b = SubElement(a, 'b') 920 b.tail = 'foo' 921 b.tail = 'bar' 922 self.assertEquals('bar', 923 b.tail) 924 self.assertXML('<a><b></b>bar</a>', a)925927 Element = self.etree.Element 928 a = Element('a') 929 a.tail = 'foo' 930 a.tail = None 931 self.assertEquals( 932 None, 933 a.tail) 934 self.assertXML('<a></a>', a)935937 Element = self.etree.Element 938 SubElement = self.etree.SubElement 939 Comment = self.etree.Comment 940 941 a = Element('a') 942 a.append(Comment('foo')) 943 self.assertEquals(a[0].tag, Comment) 944 self.assertEquals(a[0].text, 'foo')945947 Element = self.etree.Element 948 SubElement = self.etree.SubElement 949 Comment = self.etree.Comment 950 951 a = Element('a') 952 a.append(Comment('foo')) 953 self.assertEquals(a[0].text, 'foo') 954 955 a[0].text = "TEST" 956 self.assertEquals(a[0].text, 'TEST')957959 Element = self.etree.Element 960 SubElement = self.etree.SubElement 961 Comment = self.etree.Comment 962 963 a = Element('a') 964 a.append(Comment(' foo ')) 965 self.assertEquals(a[0].text, ' foo ')966968 Comment = self.etree.Comment 969 c = Comment('foo') 970 self.assertEquals({}, c.attrib) 971 self.assertEquals([], c.keys()) 972 self.assertEquals([], c.items()) 973 self.assertEquals(None, c.get('hoi')) 974 self.assertEquals(0, len(c)) 975 # should not iterate 976 for i in c: 977 pass978980 # lxml.etree separates target and text 981 Element = self.etree.Element 982 SubElement = self.etree.SubElement 983 ProcessingInstruction = self.etree.ProcessingInstruction 984 985 a = Element('a') 986 a.append(ProcessingInstruction('foo', 'some more text')) 987 self.assertEquals(a[0].tag, ProcessingInstruction) 988 self.assertXML("<a><?foo some more text?></a>", 989 a)990992 # lxml.etree separates target and text 993 Element = self.etree.Element 994 SubElement = self.etree.SubElement 995 ProcessingInstruction = self.etree.PI 996 997 a = Element('a') 998 a.append(ProcessingInstruction('foo', 'some more text')) 999 self.assertEquals(a[0].tag, ProcessingInstruction) 1000 self.assertXML("<a><?foo some more text?></a>", 1001 a)10021004 ProcessingInstruction = self.etree.ProcessingInstruction 1005 pi = ProcessingInstruction('foo') 1006 self.assertEquals({}, pi.attrib) 1007 self.assertEquals([], pi.keys()) 1008 self.assertEquals([], pi.items()) 1009 self.assertEquals(None, pi.get('hoi')) 1010 self.assertEquals(0, len(pi)) 1011 # should not iterate 1012 for i in pi: 1013 pass10141016 Element = self.etree.Element 1017 SubElement = self.etree.SubElement 1018 1019 a = Element('a') 1020 b = SubElement(a, 'b') 1021 c = Element('c') 1022 a[0] = c 1023 self.assertEquals( 1024 c, 1025 a[0]) 1026 self.assertXML('<a><c></c></a>', 1027 a) 1028 self.assertXML('<b></b>', 1029 b)10301032 Element = self.etree.Element 1033 SubElement = self.etree.SubElement 1034 1035 a = Element('a') 1036 for i in range(5): 1037 b = SubElement(a, 'b%s' % i) 1038 c = SubElement(b, 'c') 1039 for i in range(5): 1040 d = Element('d') 1041 e = SubElement(d, 'e') 1042 a[i] = d 1043 self.assertXML( 1044 '<a><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d></a>', 1045 a) 1046 self.assertXML('<c></c>', 1047 c)10481050 Element = self.etree.Element 1051 SubElement = self.etree.SubElement 1052 1053 a = Element('a') 1054 SubElement(a, 'b') 1055 d = Element('d') 1056 a[0] = d 1057 self.assertXML('<a><d></d></a>', a)10581060 Element = self.etree.Element 1061 SubElement = self.etree.SubElement 1062 1063 a = Element('a') 1064 b = SubElement(a, 'b') 1065 1066 self.assertRaises(IndexError, operator.setitem, a, 1, Element('c'))10671069 Element = self.etree.Element 1070 SubElement = self.etree.SubElement 1071 1072 a = Element('a') 1073 b = SubElement(a, 'b') 1074 b.tail = 'B2' 1075 c = Element('c') 1076 c.tail = 'C2' 1077 1078 a[0] = c 1079 self.assertXML( 1080 '<a><c></c>C2</a>', 1081 a)10821084 Element = self.etree.Element 1085 SubElement = self.etree.SubElement 1086 1087 a = Element('a') 1088 b = SubElement(a, 'b') 1089 1090 a.tag = 'c' 1091 1092 self.assertEquals( 1093 'c', 1094 a.tag) 1095 1096 self.assertXML( 1097 '<c><b></b></c>', 1098 a)10991101 Element = self.etree.Element 1102 SubElement = self.etree.SubElement 1103 tostring = self.etree.tostring 1104 1105 a = Element('{a}a') 1106 b1 = SubElement(a, '{a}b') 1107 b2 = SubElement(a, '{b}b') 1108 1109 self.assertEquals('{a}b', b1.tag) 1110 1111 b1.tag = 'c' 1112 1113 # can't use C14N here! 1114 self.assertEquals('c', b1.tag) 1115 self.assertEquals('<c', tostring(b1)[:2]) 1116 self.assert_('<c' in tostring(a))11171119 Element = self.etree.Element 1120 SubElement = self.etree.SubElement 1121 tostring = self.etree.tostring 1122 1123 a = Element('{a}a') 1124 b1 = SubElement(a, '{a}b') 1125 b2 = SubElement(a, '{b}b') 1126 1127 a.tag = 'c' 1128 1129 self.assertEquals( 1130 'c', 1131 a.tag) 1132 1133 # can't use C14N here! 1134 self.assertEquals('c', a.tag) 1135 self.assertEquals('<c', tostring(a)[:2])1136 1142 1143 a = Element("a") 1144 a.tag = strTest("TAG") 1145 self.assertXML('<TAG></TAG>', 1146 a) 11471149 Element = self.etree.Element 1150 SubElement = self.etree.SubElement 1151 1152 a = Element('a') 1153 b = SubElement(a, 'b') 1154 c = SubElement(a, 'c') 1155 d = SubElement(a, 'd') 1156 1157 del a[1] 1158 self.assertXML( 1159 '<a><b></b><d></d></a>', 1160 a) 1161 1162 del a[0] 1163 self.assertXML( 1164 '<a><d></d></a>', 1165 a) 1166 1167 del a[0] 1168 self.assertXML( 1169 '<a></a>', 1170 a) 1171 # move deleted element into other tree afterwards 1172 other = Element('other') 1173 other.append(c) 1174 self.assertXML( 1175 '<other><c></c></other>', 1176 other)11771179 Element = self.etree.Element 1180 SubElement = self.etree.SubElement 1181 1182 a = Element('a') 1183 b = SubElement(a, 'b') 1184 bs = SubElement(b, 'bs') 1185 c = SubElement(a, 'c') 1186 cs = SubElement(c, 'cs') 1187 1188 el = a[0] 1189 self.assertXML( 1190 '<a><b><bs></bs></b><c><cs></cs></c></a>', 1191 a) 1192 self.assertXML('<b><bs></bs></b>', b) 1193 self.assertXML('<c><cs></cs></c>', c) 1194 1195 del a[0] 1196 self.assertXML( 1197 '<a><c><cs></cs></c></a>', 1198 a) 1199 self.assertXML('<b><bs></bs></b>', b) 1200 self.assertXML('<c><cs></cs></c>', c) 1201 1202 a.insert(0, el) 1203 self.assertXML( 1204 '<a><b><bs></bs></b><c><cs></cs></c></a>', 1205 a) 1206 self.assertXML('<b><bs></bs></b>', b) 1207 self.assertXML('<c><cs></cs></c>', c)12081210 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] = el 1222 self.assertXML( 1223 '<a><b><bs></bs></b></a>', 1224 a) 1225 self.assertXML('<b><bs></bs></b>', b) 1226 self.assertXML('<c><cs></cs></c>', c)12271229 Element = self.etree.Element 1230 SubElement = self.etree.SubElement 1231 1232 a = Element('a') 1233 b = SubElement(a, 'b') 1234 bs = SubElement(b, 'bs') 1235 c = SubElement(a, 'c') 1236 cs = SubElement(c, 'cs') 1237 1238 el = a[0] 1239 del a[0] 1240 a[0:0] = [el] 1241 self.assertXML( 1242 '<a><b><bs></bs></b><c><cs></cs></c></a>', 1243 a) 1244 self.assertXML('<b><bs></bs></b>', b) 1245 self.assertXML('<c><cs></cs></c>', c)12461248 XML = self.etree.XML 1249 a = XML('<a><b></b>B2<c></c>C2</a>') 1250 b, c = a 1251 1252 del a[:] 1253 1254 self.assertEquals("B2", b.tail) 1255 self.assertEquals("C2", c.tail)12561258 XML = self.etree.XML 1259 a = XML('<a><b></b>B2<c></c>C2</a>') 1260 b, c = a 1261 1262 a[:] = [] 1263 1264 self.assertEquals("B2", b.tail) 1265 self.assertEquals("C2", c.tail)12661268 ElementTree = self.etree.ElementTree 1269 f = StringIO('<a><b></b>B2<c></c>C2</a>') 1270 doc = ElementTree(file=f) 1271 a = doc.getroot() 1272 del a[0] 1273 self.assertXML( 1274 '<a><c></c>C2</a>', 1275 a)12761278 Element = self.etree.Element 1279 1280 a = Element('a') 1281 a.text = 'foo' 1282 a.tail = 'bar' 1283 a.set('hoi', 'dag') 1284 a.clear() 1285 self.assertEquals(None, a.text) 1286 self.assertEquals(None, a.tail) 1287 self.assertEquals(None, a.get('hoi')) 1288 self.assertEquals('a', a.tag)12891291 Element = self.etree.Element 1292 SubElement = self.etree.SubElement 1293 1294 a = Element('a') 1295 a.text = 'foo' 1296 a.tail = 'bar' 1297 a.set('hoi', 'dag') 1298 b = SubElement(a, 'b') 1299 c = SubElement(b, 'c') 1300 a.clear() 1301 self.assertEquals(None, a.text) 1302 self.assertEquals(None, a.tail) 1303 self.assertEquals(None, a.get('hoi')) 1304 self.assertEquals('a', a.tag) 1305 self.assertEquals(0, len(a)) 1306 self.assertXML('<a></a>', 1307 a) 1308 self.assertXML('<b><c></c></b>', 1309 b)13101312 ElementTree = self.etree.ElementTree 1313 f = StringIO('<a><b></b>B2<c></c>C2</a>') 1314 doc = ElementTree(file=f) 1315 a = doc.getroot() 1316 a.clear() 1317 self.assertXML( 1318 '<a></a>', 1319 a)13201322 Element = self.etree.Element 1323 SubElement = self.etree.SubElement 1324 1325 a = Element('a') 1326 b = SubElement(a, 'b') 1327 c = SubElement(a, 'c') 1328 d = Element('d') 1329 a.insert(0, d) 1330 1331 self.assertEquals( 1332 d, 1333 a[0]) 1334 1335 self.assertXML( 1336 '<a><d></d><b></b><c></c></a>', 1337 a) 1338 1339 e = Element('e') 1340 a.insert(2, e) 1341 self.assertEquals( 1342 e, 1343 a[2]) 1344 self.assertXML( 1345 '<a><d></d><b></b><e></e><c></c></a>', 1346 a)13471349 Element = self.etree.Element 1350 SubElement = self.etree.SubElement 1351 1352 a = Element('a') 1353 b = SubElement(a, 'b') 1354 c = Element('c') 1355 1356 a.insert(2, c) 1357 self.assertEquals( 1358 c, 1359 a[1]) 1360 self.assertXML( 1361 '<a><b></b><c></c></a>', 1362 a)13631365 Element = self.etree.Element 1366 SubElement = self.etree.SubElement 1367 1368 a = Element('a') 1369 b = SubElement(a, 'b') 1370 c = SubElement(a, 'c') 1371 1372 d = Element('d') 1373 a.insert(-1, d) 1374 self.assertEquals( 1375 d, 1376 a[-2]) 1377 self.assertXML( 1378 '<a><b></b><d></d><c></c></a>', 1379 a)13801382 Element = self.etree.Element 1383 SubElement = self.etree.SubElement 1384 1385 a = Element('a') 1386 b = SubElement(a, 'b') 1387 1388 c = Element('c') 1389 c.tail = 'C2' 1390 1391 a.insert(0, c) 1392 self.assertXML( 1393 '<a><c></c>C2<b></b></a>', 1394 a)13951397 Element = self.etree.Element 1398 SubElement = self.etree.SubElement 1399 1400 a = Element('a') 1401 b = SubElement(a, 'b') 1402 c = SubElement(a, 'c') 1403 1404 a.remove(b) 1405 self.assertEquals( 1406 c, 1407 a[0]) 1408 self.assertXML( 1409 '<a><c></c></a>', 1410 a)14111413 Element = self.etree.Element 1414 SubElement = self.etree.SubElement 1415 1416 a = Element('{http://test}a') 1417 b = SubElement(a, '{http://test}b') 1418 c = SubElement(a, '{http://test}c') 1419 1420 a.remove(b) 1421 self.assertXML( 1422 '<ns0:a xmlns:ns0="http://test"><ns0:c></ns0:c></ns0:a>', 1423 a) 1424 self.assertXML( 1425 '<ns0:b xmlns:ns0="http://test"></ns0:b>', 1426 b)14271429 Element = self.etree.Element 1430 SubElement = self.etree.SubElement 1431 1432 a = Element('a') 1433 b = SubElement(a, 'b') 1434 c = SubElement(a, 'c') 1435 d = Element('d') 1436 self.assertRaises( 1437 ValueError, a.remove, d)14381440 Element = self.etree.Element 1441 SubElement = self.etree.SubElement 1442 1443 a = Element('a') 1444 b = SubElement(a, 'b') 1445 b.tail = 'b2' 1446 a.remove(b) 1447 self.assertXML( 1448 '<a></a>', 1449 a) 1450 self.assertEquals('b2', b.tail)14511453 Element = self.etree.Element 1454 SubElement = self.etree.SubElement 1455 1456 a = Element('a') 1457 b = SubElement(a, 'b') 1458 c = SubElement(a, 'c') 1459 d = SubElement(b, 'd') 1460 e = SubElement(c, 'e') 1461 self.assertXML( 1462 '<a><b><d></d></b><c><e></e></c></a>', 1463 a) 1464 self.assertEquals( 1465 [b, c], 1466 a.getchildren()) 1467 self.assertEquals( 1468 [d], 1469 b.getchildren()) 1470 self.assertEquals( 1471 [], 1472 d.getchildren())14731475 Element = self.etree.Element 1476 1477 a = Element('a') 1478 b = a.makeelement('c', {'hoi':'dag'}) 1479 self.assertXML( 1480 '<c hoi="dag"></c>', 1481 b)14821484 Element = self.etree.Element 1485 SubElement = self.etree.SubElement 1486 1487 a = Element('a') 1488 b = SubElement(a, 'b') 1489 c = SubElement(a, 'c') 1490 d = SubElement(b, 'd') 1491 e = SubElement(c, 'e') 1492 1493 self.assertEquals( 1494 [a, b, d, c, e], 1495 list(a.getiterator())) 1496 self.assertEquals( 1497 [d], 1498 list(d.getiterator()))14991501 Element = self.etree.Element 1502 SubElement = self.etree.SubElement 1503 1504 a = Element('a') 1505 b = SubElement(a, 'b') 1506 c = SubElement(a, 'c') 1507 d = SubElement(b, 'd') 1508 e = SubElement(c, 'e') 1509 1510 self.assertEquals( 1511 [], 1512 list(a.getiterator('none'))) 1513 self.assertEquals( 1514 [], 1515 list(e.getiterator('none'))) 1516 self.assertEquals( 1517 [e], 1518 list(e.getiterator()))15191521 Element = self.etree.Element 1522 SubElement = self.etree.SubElement 1523 1524 a = Element('a') 1525 b = SubElement(a, 'b') 1526 c = SubElement(a, 'c') 1527 d = SubElement(b, 'd') 1528 e = SubElement(c, 'e') 1529 1530 self.assertEquals( 1531 [a], 1532 list(a.getiterator('a'))) 1533 a2 = SubElement(e, 'a') 1534 self.assertEquals( 1535 [a, a2], 1536 list(a.getiterator('a'))) 1537 self.assertEquals( 1538 [a2], 1539 list(c.getiterator('a')))15401542 Element = self.etree.Element 1543 SubElement = self.etree.SubElement 1544 1545 a = Element('a') 1546 b = SubElement(a, 'b') 1547 c = SubElement(a, 'c') 1548 d = SubElement(b, 'd') 1549 e = SubElement(c, 'e') 1550 1551 self.assertEquals( 1552 [a, b, d, c, e], 1553 list(a.getiterator('*')))15541556 Element = self.etree.Element 1557 Comment = self.etree.Comment 1558 SubElement = self.etree.SubElement 1559 1560 a = Element('a') 1561 b = SubElement(a, 'b') 1562 comment_b = Comment("TEST-b") 1563 b.append(comment_b) 1564 1565 self.assertEquals( 1566 [comment_b], 1567 list(a.getiterator(Comment))) 1568 1569 comment_a = Comment("TEST-a") 1570 a.append(comment_a) 1571 1572 self.assertEquals( 1573 [comment_b, comment_a], 1574 list(a.getiterator(Comment))) 1575 1576 self.assertEquals( 1577 [comment_b], 1578 list(b.getiterator(Comment)))15791581 Element = self.etree.Element 1582 PI = self.etree.ProcessingInstruction 1583 SubElement = self.etree.SubElement 1584 1585 a = Element('a') 1586 b = SubElement(a, 'b') 1587 pi_b = PI("TEST-b") 1588 b.append(pi_b) 1589 1590 self.assertEquals( 1591 [pi_b], 1592 list(a.getiterator(PI))) 1593 1594 pi_a = PI("TEST-a") 1595 a.append(pi_a) 1596 1597 self.assertEquals( 1598 [pi_b, pi_a], 1599 list(a.getiterator(PI))) 1600 1601 self.assertEquals( 1602 [pi_b], 1603 list(b.getiterator(PI)))16041606 Element = self.etree.Element 1607 SubElement = self.etree.SubElement 1608 1609 a = Element('a') 1610 a.text = 'a' 1611 b = SubElement(a, 'b') 1612 b.text = 'b' 1613 b.tail = 'b1' 1614 c = SubElement(a, 'c') 1615 c.text = 'c' 1616 c.tail = 'c1' 1617 d = SubElement(b, 'd') 1618 c.text = 'd' 1619 c.tail = 'd1' 1620 e = SubElement(c, 'e') 1621 e.text = 'e' 1622 e.tail = 'e1' 1623 1624 self.assertEquals( 1625 [a, b, d, c, e], 1626 list(a.getiterator()))1627 #self.assertEquals( 1628 # [d], 1629 # list(d.getiterator())) 16301632 Element = self.etree.Element 1633 SubElement = self.etree.SubElement 1634 1635 a = Element('a') 1636 a.text = 'a' 1637 b = SubElement(a, 'b') 1638 b.text = 'b' 1639 b.tail = 'b1' 1640 c = SubElement(a, 'c') 1641 c.text = 'c' 1642 c.tail = 'c1' 1643 d = SubElement(b, 'd') 1644 c.text = 'd' 1645 c.tail = 'd1' 1646 e = SubElement(c, 'e') 1647 e.text = 'e' 1648 e.tail = 'e1' 1649 1650 self.assertEquals( 1651 [a], 1652 list(a.getiterator('a'))) 1653 a2 = SubElement(e, 'a') 1654 self.assertEquals( 1655 [a, a2], 1656 list(a.getiterator('a'))) 1657 self.assertEquals( 1658 [a2], 1659 list(e.getiterator('a')))16601662 Element = self.etree.Element 1663 1664 a = Element('a') 1665 a.attrib['foo'] = 'Foo' 1666 a.attrib['bar'] = 'Bar' 1667 self.assertEquals('Foo', a.attrib['foo']) 1668 del a.attrib['foo'] 1669 self.assertRaises(KeyError, operator.getitem, a.attrib, 'foo')16701672 Element = self.etree.Element 1673 SubElement = self.etree.SubElement 1674 1675 a = Element('a') 1676 b = SubElement(a, 'b') 1677 c = SubElement(a, 'c') 1678 d = SubElement(a, 'd') 1679 1680 self.assertEquals( 1681 [b, c], 1682 a[0:2]) 1683 self.assertEquals( 1684 [b, c, d], 1685 a[:]) 1686 self.assertEquals( 1687 [b, c, d], 1688 a[:10]) 1689 self.assertEquals( 1690 [b], 1691 a[0:1]) 1692 self.assertEquals( 1693 [], 1694 a[10:12])16951697 Element = self.etree.Element 1698 SubElement = self.etree.SubElement 1699 1700 a = Element('a') 1701 b = SubElement(a, 'b') 1702 c = SubElement(a, 'c') 1703 d = SubElement(a, 'd') 1704 1705 self.assertEquals( 1706 [d], 1707 a[-1:]) 1708 self.assertEquals( 1709 [c, d], 1710 a[-2:]) 1711 self.assertEquals( 1712 [c], 1713 a[-2:-1]) 1714 self.assertEquals( 1715 [b, c], 1716 a[-3:-1]) 1717 self.assertEquals( 1718 [b, c], 1719 a[-3:2])17201722 ElementTree = self.etree.ElementTree 1723 1724 f = StringIO('<a><b>B</b>B1<c>C</c>C1</a>') 1725 doc = ElementTree(file=f) 1726 a = doc.getroot() 1727 b = a[0] 1728 c = a[1] 1729 self.assertEquals( 1730 [b, c], 1731 a[:]) 1732 self.assertEquals( 1733 [b], 1734 a[0:1]) 1735 self.assertEquals( 1736 [c], 1737 a[1:])17381740 Element = self.etree.Element 1741 Comment = self.etree.Comment 1742 SubElement = self.etree.SubElement 1743 1744 a = Element('a') 1745 b = SubElement(a, 'b') 1746 foo = Comment('foo') 1747 a.append(foo) 1748 c = SubElement(a, 'c') 1749 self.assertEquals( 1750 [b, foo, c], 1751 a[:]) 1752 self.assertEquals( 1753 foo, 1754 a[1]) 1755 a[1] = new = Element('new') 1756 self.assertEquals( 1757 new, 1758 a[1]) 1759 self.assertXML( 1760 '<a><b></b><new></new><c></c></a>', 1761 a)17621764 Element = self.etree.Element 1765 SubElement = self.etree.SubElement 1766 1767 a = Element('a') 1768 b = SubElement(a, 'b') 1769 c = SubElement(a, 'c') 1770 d = SubElement(a, 'd') 1771 e = SubElement(a, 'e') 1772 1773 del a[1:3] 1774 self.assertEquals( 1775 [b, e], 1776 list(a))17771779 Element = self.etree.Element 1780 SubElement = self.etree.SubElement 1781 1782 a = Element('a') 1783 b = SubElement(a, 'b') 1784 c = SubElement(a, 'c') 1785 d = SubElement(a, 'd') 1786 e = SubElement(a, 'e') 1787 1788 del a[1:-1] 1789 self.assertEquals( 1790 [b, e], 1791 list(a))17921794 Element = self.etree.Element 1795 SubElement = self.etree.SubElement 1796 1797 a = Element('a') 1798 b = SubElement(a, 'b') 1799 c = SubElement(a, 'c') 1800 d = SubElement(a, 'd') 1801 e = SubElement(a, 'e') 1802 1803 del a[-3:-1] 1804 self.assertEquals( 1805 [b, e], 1806 list(a))18071809 ElementTree = self.etree.ElementTree 1810 f = StringIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>') 1811 doc = ElementTree(file=f) 1812 a = doc.getroot() 1813 del a[1:3] 1814 self.assertXML( 1815 '<a><b></b>B2<e></e>E2</a>', 1816 a)18171819 # this could trigger a crash 1820 Element = self.etree.Element 1821 SubElement = self.etree.SubElement 1822 a = Element('a') 1823 b = SubElement(a, 'b') 1824 c = SubElement(b, 'c') 1825 del b # no more reference to b 1826 del a[:] 1827 self.assertEquals('c', c.tag)18281830 Element = self.etree.Element 1831 SubElement = self.etree.SubElement 1832 1833 a = Element('a') 1834 b = SubElement(a, 'b') 1835 c = SubElement(a, 'c') 1836 d = SubElement(a, 'd') 1837 1838 e = Element('e') 1839 f = Element('f') 1840 g = Element('g') 1841 1842 s = [e, f, g] 1843 a[1:2] = s 1844 self.assertEquals( 1845 [b, e, f, g, d], 1846 list(a))18471849 ElementTree = self.etree.ElementTree 1850 Element = self.etree.Element 1851 f = StringIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>') 1852 doc = ElementTree(file=f) 1853 a = doc.getroot() 1854 x = Element('x') 1855 y = Element('y') 1856 z = Element('z') 1857 x.tail = 'X2' 1858 y.tail = 'Y2' 1859 z.tail = 'Z2' 1860 a[1:3] = [x, y, z] 1861 self.assertXML( 1862 '<a><b></b>B2<x></x>X2<y></y>Y2<z></z>Z2<e></e>E2</a>', 1863 a)18641866 Element = self.etree.Element 1867 SubElement = self.etree.SubElement 1868 1869 a = Element('a') 1870 b = SubElement(a, 'b') 1871 c = SubElement(a, 'c') 1872 d = SubElement(a, 'd') 1873 1874 x = Element('x') 1875 y = Element('y') 1876 1877 a[1:-1] = [x, y] 1878 self.assertEquals( 1879 [b, x, y, d], 1880 list(a))18811883 Element = self.etree.Element 1884 SubElement = self.etree.SubElement 1885 1886 a = Element('a') 1887 b = SubElement(a, 'b') 1888 c = SubElement(a, 'c') 1889 d = SubElement(a, 'd') 1890 1891 e = Element('e') 1892 f = Element('f') 1893 g = Element('g') 1894 1895 s = [e, f, g] 1896 a[3:] = s 1897 self.assertEquals( 1898 [b, c, d, e, f, g], 1899 list(a))19001902 Element = self.etree.Element 1903 1904 a = Element('a') 1905 1906 b = Element('b') 1907 c = Element('c') 1908 1909 a[:] = [b, c] 1910 self.assertEquals( 1911 [b, c], 1912 list(a))19131915 Element = self.etree.Element 1916 ElementTree = self.etree.ElementTree 1917 1918 a = Element('a') 1919 a.tail = 'A2' 1920 t = ElementTree(element=a) 1921 self.assertEquals('A2', 1922 a.tail)19231925 Element = self.etree.Element 1926 SubElement = self.etree.SubElement 1927 ElementTree = self.etree.ElementTree 1928 1929 a = Element('a') 1930 b = SubElement(a, 'b') 1931 c = SubElement(a, 'c') 1932 d = SubElement(b, 'd') 1933 e = SubElement(c, 'e') 1934 t = ElementTree(element=a) 1935 1936 self.assertEquals( 1937 [a, b, d, c, e], 1938 list(t.getiterator()))19391941 Element = self.etree.Element 1942 SubElement = self.etree.SubElement 1943 ElementTree = self.etree.ElementTree 1944 a = Element('a') 1945 b = SubElement(a, 'b') 1946 c = SubElement(a, 'c') 1947 d = SubElement(b, 'd') 1948 e = SubElement(c, 'e') 1949 t = ElementTree(element=a) 1950 1951 self.assertEquals( 1952 [a], 1953 list(t.getiterator('a'))) 1954 a2 = SubElement(e, 'a') 1955 self.assertEquals( 1956 [a, a2], 1957 list(t.getiterator('a')))19581960 ElementTree = self.etree.ElementTree 1961 ns = 'http://xml.infrae.com/1' 1962 f = StringIO('<x:a xmlns:x="%s"><x:b></x:b></x:a>' % ns) 1963 t = ElementTree(file=f) 1964 a = t.getroot() 1965 self.assertEquals('{%s}a' % ns, 1966 a.tag) 1967 self.assertEquals('{%s}b' % ns, 1968 a[0].tag)19691971 ElementTree = self.etree.ElementTree 1972 ns = 'http://xml.infrae.com/1' 1973 ns2 = 'http://xml.infrae.com/2' 1974 f = StringIO('<x:a xmlns:x="%s" xmlns:y="%s"><x:b></x:b><y:b></y:b></x:a>' % (ns, ns2)) 1975 t = ElementTree(file=f) 1976 a = t.getroot() 1977 self.assertEquals('{%s}a' % ns, 1978 a.tag) 1979 self.assertEquals('{%s}b' % ns, 1980 a[0].tag) 1981 self.assertEquals('{%s}b' % ns2, 1982 a[1].tag)19831985 Element = self.etree.Element 1986 SubElement = self.etree.SubElement 1987 ns = 'http://xml.infrae.com/1' 1988 ns2 = 'http://xml.infrae.com/2' 1989 a = Element('{%s}a' % ns) 1990 b = SubElement(a, '{%s}b' % ns2) 1991 c = SubElement(a, '{%s}c' % ns) 1992 self.assertEquals('{%s}a' % ns, 1993 a.tag) 1994 self.assertEquals('{%s}b' % ns2, 1995 b.tag) 1996 self.assertEquals('{%s}c' % ns, 1997 c.tag) 1998 self.assertEquals('{%s}a' % ns, 1999 a.tag) 2000 self.assertEquals('{%s}b' % ns2, 2001 b.tag) 2002 self.assertEquals('{%s}c' % ns, 2003 c.tag)20042006 Element = self.etree.Element 2007 SubElement = self.etree.SubElement 2008 ElementTree = self.etree.ElementTree 2009 2010 ns = 'http://xml.infrae.com/1' 2011 ns2 = 'http://xml.infrae.com/2' 2012 f = StringIO('<a xmlns="%s" xmlns:x="%s"><x:b></x:b><b></b></a>' % (ns, ns2)) 2013 t = ElementTree(file=f) 2014 2015 a = t.getroot() 2016 self.assertEquals('{%s}a' % ns, 2017 a.tag) 2018 self.assertEquals('{%s}b' % ns2, 2019 a[0].tag) 2020 self.assertEquals('{%s}b' % ns, 2021 a[1].tag)20222024 Element = self.etree.Element 2025 ns = 'http://xml.infrae.com/1' 2026 ns2 = 'http://xml.infrae.com/2' 2027 a = Element('a') 2028 a.set('{%s}foo' % ns, 'Foo') 2029 a.set('{%s}bar' % ns2, 'Bar') 2030 self.assertEquals( 2031 'Foo', 2032 a.get('{%s}foo' % ns)) 2033 self.assertEquals( 2034 'Bar', 2035 a.get('{%s}bar' % ns2)) 2036 try: 2037 self.assertXML( 2038 '<a xmlns:ns0="%s" xmlns:ns1="%s" ns0:foo="Foo" ns1:bar="Bar"></a>' % (ns, ns2), 2039 a) 2040 except AssertionError: 2041 self.assertXML( 2042 '<a xmlns:ns0="%s" xmlns:ns1="%s" ns1:foo="Foo" ns0:bar="Bar"></a>' % (ns2, ns), 2043 a)20442046 Element = self.etree.Element 2047 ElementTree = self.etree.ElementTree 2048 2049 one = self.etree.parse( 2050 StringIO('<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>')) 2051 baz = one.getroot()[0][0] 2052 2053 two = ElementTree(Element('root')) 2054 two.getroot().append(baz) 2055 # removing the originating document could cause a crash/error before 2056 # as namespace is not moved along with it 2057 del one 2058 self.assertEquals('{http://a.b.c}baz', baz.tag)20592061 tostring = self.etree.tostring 2062 root = self.etree.XML( 2063 '<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>') 2064 baz = root[0][0] 2065 2066 nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']", 2067 tostring(baz)) 2068 self.assertEquals(["http://a.b.c"], nsdecl)20692071 tostring = self.etree.tostring 2072 root = self.etree.XML( 2073 '<foo><bar xmlns="http://a.b.c"><baz/></bar></foo>') 2074 baz = root[0][0] 2075 2076 nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']", 2077 tostring(baz)) 2078 self.assertEquals(["http://a.b.c"], nsdecl)20792081 tostring = self.etree.tostring 2082 root = self.etree.XML( 2083 '<foo xmlns:ns="http://a.b.c"><bar><ns:baz/></bar></foo>') 2084 baz = root[0][0] 2085 2086 nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']", 2087 tostring(baz)) 2088 2089 self.assertEquals(["http://a.b.c"], nsdecl)20902092 Element = self.etree.Element 2093 SubElement = self.etree.SubElement 2094 2095 root = Element("foo") 2096 bar = SubElement(root, "{http://a.b.c}bar") 2097 baz = SubElement(bar, "{http://a.b.c}baz") 2098 2099 nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']", 2100 self.etree.tostring(baz)) 2101 2102 self.assertEquals(["http://a.b.c"], nsdecl)21032105 Element = self.etree.Element 2106 2107 root = Element('element') 2108 2109 subelement = Element('subelement', 2110 {"{http://www.w3.org/XML/1998/namespace}id": "foo"}) 2111 self.assertEquals(1, len(subelement.attrib)) 2112 self.assertEquals( 2113 "foo", 2114 subelement.get("{http://www.w3.org/XML/1998/namespace}id")) 2115 2116 root.append(subelement) 2117 self.assertEquals(1, len(subelement.attrib)) 2118 self.assertEquals( 2119 {"{http://www.w3.org/XML/1998/namespace}id" : "foo"}.items(), 2120 subelement.attrib.items()) 2121 self.assertEquals( 2122 "foo", 2123 subelement.get("{http://www.w3.org/XML/1998/namespace}id"))21242126 tostring = self.etree.tostring 2127 Element = self.etree.Element 2128 SubElement = self.etree.SubElement 2129 2130 a = Element('a') 2131 b = SubElement(a, 'b') 2132 c = SubElement(a, 'c') 2133 2134 self.assertEquals('<a><b></b><c></c></a>', 2135 canonicalize(tostring(a)))21362138 tostring = self.etree.tostring 2139 Element = self.etree.Element 2140 SubElement = self.etree.SubElement 2141 2142 a = Element('a') 2143 b = SubElement(a, 'b') 2144 c = SubElement(a, 'c') 2145 d = SubElement(c, 'd') 2146 self.assertEquals('<b></b>', 2147 canonicalize(tostring(b))) 2148 self.assertEquals('<c><d></d></c>', 2149 canonicalize(tostring(c)))21502152 tostring = self.etree.tostring 2153 Element = self.etree.Element 2154 SubElement = self.etree.SubElement 2155 2156 a = Element('a') 2157 b = SubElement(a, 'b') 2158 c = SubElement(a, 'c') 2159 d = SubElement(c, 'd') 2160 b.tail = 'Foo' 2161 2162 self.assert_(tostring(b) == '<b/>Foo' or 2163 tostring(b) == '<b />Foo')21642166 tostring = self.etree.tostring 2167 Element = self.etree.Element 2168 SubElement = self.etree.SubElement 2169 2170 html = Element('html') 2171 body = SubElement(html, 'body') 2172 p = SubElement(body, 'p') 2173 p.text = "html" 2174 SubElement(p, 'br').tail = "test" 2175 2176 self.assertEquals('<html><body><p>html<br>test</p></body></html>', 2177 tostring(html, method="html"))21782180 tostring = self.etree.tostring 2181 Element = self.etree.Element 2182 SubElement = self.etree.SubElement 2183 2184 a = Element('a') 2185 a.text = "A" 2186 a.tail = "tail" 2187 b = SubElement(a, 'b') 2188 b.text = "B" 2189 b.tail = "TAIL" 2190 c = SubElement(a, 'c') 2191 c.text = "C" 2192 2193 self.assertEquals('ABTAILCtail', 2194 tostring(a, method="text"))21952197 iterparse = self.etree.iterparse 2198 f = StringIO('<a><b></b><c/></a>') 2199 2200 iterator = iterparse(f) 2201 self.assertEquals(None, 2202 iterator.root) 2203 events = list(iterator) 2204 root = iterator.root 2205 self.assertEquals( 2206 [('end', root[0]), ('end', root[1]), ('end', root)], 2207 events)22082210 iterparse = self.etree.iterparse 2211 iterator = iterparse(fileInTestDir("test.xml")) 2212 self.assertEquals(None, 2213 iterator.root) 2214 events = list(iterator) 2215 root = iterator.root 2216 self.assertEquals( 2217 [('end', root[0]), ('end', root)], 2218 events)22192221 iterparse = self.etree.iterparse 2222 f = StringIO('<a><b></b><c/></a>') 2223 2224 iterator = iterparse(f, events=('start',)) 2225 events = list(iterator) 2226 root = iterator.root 2227 self.assertEquals( 2228 [('start', root), ('start', root[0]), ('start', root[1])], 2229 events)22302232 iterparse = self.etree.iterparse 2233 f = StringIO('<a><b></b><c/></a>') 2234 2235 iterator = iterparse(f, events=('start','end')) 2236 events = list(iterator) 2237 root = iterator.root 2238 self.assertEquals( 2239 [('start', root), ('start', root[0]), ('end', root[0]), 2240 ('start', root[1]), ('end', root[1]), ('end', root)], 2241 events)22422244 iterparse = self.etree.iterparse 2245 f = StringIO('<a><b></b><c/></a>') 2246 2247 iterator = iterparse(f) 2248 for event, elem in iterator: 2249 elem.clear() 2250 2251 root = iterator.root 2252 self.assertEquals(0, 2253 len(root))22542256 iterparse = self.etree.iterparse 2257 CHILD_COUNT = 12345 2258 f = StringIO('<a>%s</a>' % ('<b>test</b>'*CHILD_COUNT)) 2259 2260 i = 0 2261 for key in iterparse(f): 2262 event, element = key 2263 i += 1 2264 self.assertEquals(i, CHILD_COUNT + 1)22652267 iterparse = self.etree.iterparse 2268 f = StringIO('<a xmlns="ns1"><b><c xmlns="ns2"/></b></a>') 2269 2270 attr_name = '{testns}bla' 2271 events = [] 2272 iterator = iterparse(f, events=('start','end','start-ns','end-ns')) 2273 for event, elem in iterator: 2274 events.append(event) 2275 if event == 'start': 2276 if elem.tag != '{ns1}a': 2277 elem.set(attr_name, 'value') 2278 2279 self.assertEquals( 2280 ['start-ns', 'start', 'start', 'start-ns', 'start', 2281 'end', 'end-ns', 'end', 'end', 'end-ns'], 2282 events) 2283 2284 root = iterator.root 2285 self.assertEquals( 2286 None, 2287 root.get(attr_name)) 2288 self.assertEquals( 2289 'value', 2290 root[0].get(attr_name))22912293 iterparse = self.etree.iterparse 2294 f = StringIO('<a><b><d/></b><c/></a>') 2295 2296 counts = [] 2297 for event, elem in iterparse(f): 2298 counts.append(len(list(elem.getiterator()))) 2299 self.assertEquals( 2300 [1,2,1,4], 2301 counts)23022304 parse = self.etree.parse 2305 # from file 2306 tree = parse(fileInTestDir('test.xml')) 2307 self.assertXML( 2308 '<a><b></b></a>', 2309 tree.getroot())2310 23142316 parse = self.etree.parse 2317 # from file object 2318 f = open(fileInTestDir('test.xml'), 'r') 2319 tree = parse(f) 2320 f.close() 2321 self.assertXML( 2322 '<a><b></b></a>', 2323 tree.getroot())23242326 parse = self.etree.parse 2327 # from StringIO 2328 f = StringIO('<a><b></b></a>') 2329 tree = parse(f) 2330 f.close() 2331 self.assertXML( 2332 '<a><b></b></a>', 2333 tree.getroot() 2334 )23352337 # this can fail in libxml2 <= 2.6.22 2338 parse = self.etree.parse 2339 tree = parse(StringIO('<?xml version="1.0" encoding="ascii"?><html/>')) 2340 self.assertXML('<html></html>', 2341 tree.getroot())23422344 Element = self.etree.Element 2345 2346 a = Element('a') 2347 a.text = u'Søk på nettet' 2348 self.assertXML( 2349 u'<a>Søk på nettet</a>'.encode('UTF-8'), 2350 a, 'utf-8')23512353 ElementTree = self.etree.ElementTree 2354 Element = self.etree.Element 2355 2356 a = Element('a') 2357 a.text = u'Søk på nettet' 2358 2359 f = StringIO() 2360 tree = ElementTree(element=a) 2361 tree.write(f, 'utf-8') 2362 self.assertEquals(u'<a>Søk på nettet</a>'.encode('UTF-8'), 2363 f.getvalue())23642366 parse = self.etree.parse 2367 # from file 2368 tree = parse(fileInTestDir('test-string.xml')) 2369 self.assertXML( 2370 u'<a>Søk på nettet</a>'.encode('UTF-8'), 2371 tree.getroot(), 'UTF-8')23722374 parse = self.etree.parse 2375 # from file object 2376 f = open(fileInTestDir('test-string.xml'), 'r') 2377 tree = parse(f) 2378 f.close() 2379 self.assertXML( 2380 u'<a>Søk på nettet</a>'.encode('UTF-8'), 2381 tree.getroot(), 'UTF-8')23822384 ElementTree = self.etree.ElementTree 2385 Element = self.etree.Element 2386 2387 a = Element('a') 2388 a.text = u'Søk på nettet' 2389 2390 f = StringIO() 2391 tree = ElementTree(element=a) 2392 tree.write(f, 'iso-8859-1') 2393 result = f.getvalue() 2394 declaration = "<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>" 2395 self.assertEncodingDeclaration(result,'iso-8859-1') 2396 result = result.split('?>', 1)[-1] 2397 if result[0] == '\n': 2398 result = result[1:] 2399 self.assertEquals(u'<a>Søk på nettet</a>'.encode('iso-8859-1'), 2400 result)24012403 XMLParser = self.etree.XMLParser 2404 2405 text = u'Søk på nettet' 2406 xml_latin1 = (u'<a>%s</a>' % text).encode('iso-8859-1') 2407 2408 self.assertRaises(self.etree.ParseError, 2409 self.etree.parse, 2410 StringIO(xml_latin1)) 2411 2412 tree = self.etree.parse(StringIO(xml_latin1), 2413 XMLParser(encoding="iso-8859-1")) 2414 a = tree.getroot() 2415 self.assertEquals(a.text, text)24162418 XMLParser = self.etree.XMLParser 2419 2420 text = u'Søk på nettet' 2421 wrong_declaration = "<?xml version='1.0' encoding='UTF-8'?>" 2422 xml_latin1 = (u'%s<a>%s</a>' % (wrong_declaration, text) 2423 ).encode('iso-8859-1') 2424 2425 self.assertRaises(self.etree.ParseError, 2426 self.etree.parse, 2427 StringIO(xml_latin1)) 2428 2429 tree = self.etree.parse(StringIO(xml_latin1), 2430 XMLParser(encoding="iso-8859-1")) 2431 a = tree.getroot() 2432 self.assertEquals(a.text, text)24332435 # raise error on wrong encoding declaration in unicode strings 2436 XML = self.etree.XML 2437 test_utf = (u'<?xml version="1.0" encoding="iso-8859-1"?>' + \ 2438 u'<a>Søk på nettet</a>') 2439 self.assertRaises(SyntaxError, XML, test_utf)24402442 ElementTree = self.etree.ElementTree 2443 Element = self.etree.Element 2444 2445 a = Element('a') 2446 a.text = u'Søk på nettet' 2447 2448 f = StringIO() 2449 tree = ElementTree(element=a) 2450 tree.write(f) 2451 data = f.getvalue() 2452 self.assertEquals( 2453 u'<a>Søk på nettet</a>'.encode('ASCII', 'xmlcharrefreplace'), 2454 data)24552457 Element = self.etree.Element 2458 tostring = self.etree.tostring 2459 2460 a = Element('a') 2461 a.text = u'Søk på nettet' 2462 self.assertEquals(u'<a>Søk på nettet</a>'.encode('UTF-8'), 2463 tostring(a, 'utf-8'))24642466 Element = self.etree.Element 2467 tostring = self.etree.tostring 2468 2469 a = Element('a') 2470 a.text = u'Søk på nettet' 2471 self.assertRaises(LookupError, tostring, a, 'Invalid Encoding')24722474 Element = self.etree.Element 2475 SubElement = self.etree.SubElement 2476 tostring = self.etree.tostring 2477 2478 a = Element('a') 2479 b = SubElement(a, 'b') 2480 b.text = u'Søk på nettet' 2481 self.assertEquals(u'<b>Søk på nettet</b>'.encode('UTF-8'), 2482 tostring(b, 'utf-8'))24832485 Element = self.etree.Element 2486 SubElement = self.etree.SubElement 2487 tostring = self.etree.tostring 2488 2489 a = Element('a') 2490 b = SubElement(a, 'b') 2491 b.text = u'Søk på nettet' 2492 b.tail = u'Søk' 2493 self.assertEquals(u'<b>Søk på nettet</b>Søk'.encode('UTF-8'), 2494 tostring(b, 'utf-8'))24952497 Element = self.etree.Element 2498 SubElement = self.etree.SubElement 2499 tostring = self.etree.tostring 2500 2501 a = Element('a') 2502 a.text = u'Søk på nettet' 2503 2504 expected = '<a>Søk på nettet</a>' 2505 self.assertEquals( 2506 expected, 2507 tostring(a))25082510 Element = self.etree.Element 2511 SubElement = self.etree.SubElement 2512 tostring = self.etree.tostring 2513 2514 a = Element('a') 2515 b = SubElement(a, 'b') 2516 b.text = u'Søk på nettet' 2517 2518 expected = '<b>Søk på nettet</b>' 2519 self.assertEquals( 2520 expected, 2521 tostring(b))25222524 utext = u'Søk på nettet' 2525 uxml = u'<p>%s</p>' % utext 2526 prologue = '<?xml version="1.0" encoding="iso-8859-1" ?>' 2527 isoxml = prologue + uxml.encode('iso-8859-1') 2528 tree = self.etree.XML(isoxml) 2529 self.assertEquals(utext, tree.text)25302532 utext = u'Søk på nettet' 2533 uxml = u'<?xml version="1.0" encoding="UTF-8"?>' + \ 2534 u'<p>%s</p>' % utext 2535 bom = '\xEF\xBB\xBF' 2536 xml = bom + uxml.encode("utf-8") 2537 tree = etree.XML(xml) 2538 self.assertEquals(utext, tree.text)25392541 utext = u'Søk på nettet' 2542 uxml = u'<p>%s</p>' % utext 2543 prologue = '<?xml version="1.0" encoding="iso-8859-1" ?>' 2544 isoxml = prologue + uxml.encode('iso-8859-1') 2545 el = self.etree.parse(StringIO(isoxml)).getroot() 2546 self.assertEquals(utext, el.text)25472549 Element = self.etree.Element 2550 ElementTree = self.etree.ElementTree 2551 2552 a = Element('a') 2553 a.text = "Foo" 2554 atree = ElementTree(a) 2555 2556 btree = copy.deepcopy(atree) 2557 self.assertEqual("Foo", atree.getroot().text) 2558 self.assertEqual("Foo", btree.getroot().text) 2559 self.assertFalse(btree is atree) 2560 self.assertFalse(btree.getroot() is atree.getroot())25612563 Element = self.etree.Element 2564 2565 a = Element('a') 2566 a.text = 'Foo' 2567 2568 b = copy.deepcopy(a) 2569 self.assertEquals('Foo', b.text) 2570 2571 b.text = 'Bar' 2572 self.assertEquals('Bar', b.text) 2573 self.assertEquals('Foo', a.text) 2574 2575 del a 2576 self.assertEquals('Bar', b.text)25772579 Element = self.etree.Element 2580 2581 a = Element('a') 2582 a.tail = 'Foo' 2583 2584 b = copy.deepcopy(a) 2585 self.assertEquals('Foo', b.tail) 2586 2587 b.tail = 'Bar' 2588 self.assertEquals('Bar', b.tail) 2589 self.assertEquals('Foo', a.tail) 2590 2591 del a 2592 self.assertEquals('Bar', b.tail)25932595 Element = self.etree.Element 2596 SubElement = self.etree.SubElement 2597 2598 root = Element('root') 2599 a = SubElement(root, 'a') 2600 a.text = 'FooText' 2601 a.tail = 'FooTail' 2602 2603 b = copy.deepcopy(a) 2604 self.assertEquals('FooText', b.text) 2605 self.assertEquals('FooTail', b.tail) 2606 2607 b.text = 'BarText' 2608 b.tail = 'BarTail' 2609 self.assertEquals('BarTail', b.tail) 2610 self.assertEquals('FooTail', a.tail) 2611 self.assertEquals('BarText', b.text) 2612 self.assertEquals('FooText', a.text) 2613 2614 del a 2615 self.assertEquals('BarTail', b.tail) 2616 self.assertEquals('BarText', b.text)26172619 root = self.etree.XML('''<doc xmlns="dns" xmlns:t="tns"> 2620 <parent><node t:foo="bar" /></parent> 2621 </doc>''') 2622 self.assertEquals( 2623 root[0][0].get('{tns}foo'), 2624 copy.deepcopy(root[0])[0].get('{tns}foo') ) 2625 self.assertEquals( 2626 root[0][0].get('{tns}foo'), 2627 copy.deepcopy(root[0][0]).get('{tns}foo') )26282630 # previously caused a crash 2631 Element = self.etree.Element 2632 tostring = self.etree.tostring 2633 2634 a = Element('a') 2635 b = copy.deepcopy(a) 2636 a.append( Element('C') ) 2637 b.append( Element('X') ) 2638 2639 self.assertEquals('<a><C/></a>', 2640 tostring(a).replace(' ', '')) 2641 self.assertEquals('<a><X/></a>', 2642 tostring(b).replace(' ', ''))26432645 Element = self.etree.Element 2646 2647 a = Element('a') 2648 a.text = 'Foo' 2649 2650 b = copy.copy(a) 2651 self.assertEquals('Foo', b.text) 2652 2653 b.text = 'Bar' 2654 self.assertEquals('Bar', b.text) 2655 self.assertEquals('Foo', a.text)2656 # XXX ElementTree will share nodes, but lxml.etree won't.. 26572659 Element = self.etree.Element 2660 ElementTree = self.etree.ElementTree 2661 2662 a = Element('a') 2663 a.text = 'Foo' 2664 atree = ElementTree(a) 2665 2666 btree = copy.copy(atree) 2667 self.assertFalse(btree is atree) 2668 self.assert_(btree.getroot() is atree.getroot()) 2669 self.assertEquals('Foo', atree.getroot().text)26702672 # deprecated as of ET 1.3/lxml 2.0 2673 etree = self.etree 2674 e = etree.Element('foo') 2675 self.assertEquals(False, bool(e)) 2676 etree.SubElement(e, 'bar') 2677 self.assertEquals(True, bool(e)) 2678 e = etree.Element('foo') 2679 e.text = 'hey' 2680 self.assertEquals(False, bool(e)) 2681 e = etree.Element('foo') 2682 e.tail = 'bar' 2683 self.assertEquals(False, bool(e)) 2684 e = etree.Element('foo') 2685 e.set('bar', 'Bar') 2686 self.assertEquals(False, bool(e))26872689 etree = self.etree 2690 2691 a = etree.Element('a') 2692 b = etree.SubElement(a, 'b') 2693 2694 t = etree.ElementTree(a) 2695 self.assertEquals(self._rootstring(t), '<a><b/></a>') 2696 2697 t1 = etree.ElementTree(a) 2698 self.assertEquals(self._rootstring(t1), '<a><b/></a>') 2699 self.assertEquals(self._rootstring(t), '<a><b/></a>') 2700 2701 t2 = etree.ElementTree(b) 2702 self.assertEquals(self._rootstring(t2), '<b/>') 2703 self.assertEquals(self._rootstring(t1), '<a><b/></a>') 2704 self.assertEquals(self._rootstring(t), '<a><b/></a>')27052707 etree = self.etree 2708 qname = etree.QName('myns', 'a') 2709 a1 = etree.Element(qname) 2710 a2 = etree.SubElement(a1, qname) 2711 self.assertEquals(a1.tag, "{myns}a") 2712 self.assertEquals(a2.tag, "{myns}a")27132715 etree = self.etree 2716 qname1 = etree.QName('myns', 'a') 2717 qname2 = etree.QName('myns', 'a') 2718 self.assertEquals(qname1, "{myns}a") 2719 self.assertEquals("{myns}a", qname2) 2720 self.assertEquals(qname1, qname1) 2721 self.assertEquals(qname1, qname2)27222724 etree = self.etree 2725 qname = etree.QName('myns', 'a') 2726 2727 a = etree.Element(qname) 2728 a.set(qname, "value") 2729 2730 self.assertEquals(a.get(qname), "value") 2731 self.assertEquals(a.get("{myns}a"), "value")27322734 etree = self.etree 2735 qname = etree.QName('myns', 'a') 2736 2737 a = etree.Element(qname) 2738 a.attrib[qname] = "value" 2739 2740 self.assertEquals(a.attrib[qname], "value") 2741 self.assertEquals(a.attrib.get(qname), "value") 2742 2743 self.assertEquals(a.attrib["{myns}a"], "value") 2744 self.assertEquals(a.attrib.get("{myns}a"), "value")27452747 etree = self.etree 2748 qname = etree.QName('http://myns', 'a') 2749 a = etree.Element(qname) 2750 a.set(qname, qname) 2751 2752 self.assertXML( 2753 '<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>', 2754 a)27552757 etree = self.etree 2758 qname = etree.QName('http://myns', 'a') 2759 a = etree.Element('a') 2760 a.set('a', qname) 2761 2762 self.assertXML( 2763 '<a xmlns:ns0="http://myns" a="ns0:a"></a>', 2764 a)27652767 etree = self.etree 2768 qname = etree.QName('http://myns', 'a') 2769 a = etree.Element(qname) 2770 a.attrib[qname] = qname 2771 2772 self.assertXML( 2773 '<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>', 2774 a)27752777 etree = self.etree 2778 parser = etree.XMLParser() 2779 if hasattr(parser, "version"): 2780 # ElementTree 1.3+, cET 2781 self.assert_(re.match("[^ ]+ [0-9.]+", parser.version))2782 2783 # feed parser interface 27842786 parser = self.etree.XMLParser() 2787 2788 parser.feed('<?xml version=') 2789 parser.feed('"1.0"?><ro') 2790 parser.feed('ot><') 2791 parser.feed('a test="works"/') 2792 parser.feed('></root') 2793 parser.feed('>') 2794 2795 root = parser.close() 2796 2797 self.assertEquals(root.tag, "root") 2798 self.assertEquals(root[0].tag, "a") 2799 self.assertEquals(root[0].get("test"), "works")28002802 ParseError = self.etree.ParseError 2803 parser = self.etree.XMLParser() 2804 self.assertRaises(ParseError, parser.close)28052807 ParseError = self.etree.ParseError 2808 parser = self.etree.XMLParser() 2809 2810 parser.feed('<?xml version=') 2811 parser.feed('"1.0"?><ro') 2812 2813 self.assertRaises(ParseError, parser.close)28142816 ParseError = self.etree.ParseError 2817 parser = self.etree.XMLParser() 2818 2819 parser.feed('<?xml version=') 2820 parser.feed('"1.0"?><ro') 2821 try: 2822 parser.feed('<><><><><><><') 2823 except ParseError: 2824 # can raise, but not required before close() 2825 pass 2826 2827 self.assertRaises(ParseError, parser.close)2828 2829 # parser target interface 28302832 assertEquals = self.assertEquals 2833 assertFalse = self.assertFalse 2834 2835 events = [] 2836 class Target(object): 2837 def start(self, tag, attrib): 2838 events.append("start") 2839 assertFalse(attrib) 2840 assertEquals("TAG", tag)2841 def end(self, tag): 2842 events.append("end") 2843 assertEquals("TAG", tag) 2844 def close(self): 2845 return "DONE" 2846 2847 parser = self.etree.XMLParser(target=Target()) 2848 2849 parser.feed("<TAG/>") 2850 done = parser.close() 2851 2852 self.assertEquals("DONE", done) 2853 self.assertEquals(["start", "end"], events) 28542856 assertEquals = self.assertEquals 2857 assertFalse = self.assertFalse 2858 2859 events = [] 2860 class Target(object): 2861 def start(self, tag, attrib): 2862 events.append("start-" + tag) 2863 for name, value in attrib.iteritems(): 2864 assertEquals(tag + name, value)2865 def end(self, tag): 2866 events.append("end-" + tag) 2867 def close(self): 2868 return "DONE" 2869 2870 parser = self.etree.XMLParser(target=Target()) 2871 2872 parser.feed('<root a="roota" b="rootb"><sub c="subc"/></root>') 2873 done = parser.close() 2874 2875 self.assertEquals("DONE", done) 2876 self.assertEquals(["start-root", "start-sub", "end-sub", "end-root"], 2877 events) 28782880 assertEquals = self.assertEquals 2881 assertFalse = self.assertFalse 2882 2883 events = [] 2884 class Target(object): 2885 def start(self, tag, attrib): 2886 events.append("start-" + tag)2887 def end(self, tag): 2888 events.append("end-" + tag) 2889 def data(self, data): 2890 events.append("data-" + data) 2891 def close(self): 2892 return "DONE" 2893 2894 parser = self.etree.XMLParser(target=Target()) 2895 2896 parser.feed('<root>A<sub/>B</root>') 2897 done = parser.close() 2898 2899 self.assertEquals("DONE", done) 2900 self.assertEquals(["start-root", "data-A", "start-sub", 2901 "end-sub", "data-B", "end-root"], 2902 events) 2903 2904 # helper methods 29052907 """Write out element for comparison. 2908 """ 2909 data = self.etree.tostring(element, encoding=encoding) 2910 if encoding != 'us-ascii': 2911 data = unicode(data, encoding) 2912 return canonicalize(data)29132915 """Write out element for comparison, using real file. 2916 """ 2917 ElementTree = self.etree.ElementTree 2918 handle, filename = tempfile.mkstemp() 2919 try: 2920 f = open(filename, 'wb') 2921 tree = ElementTree(element=element) 2922 tree.write(f, encoding) 2923 f.close() 2924 f = open(filename, 'rb') 2925 data = f.read() 2926 f.close() 2927 finally: 2928 os.close(handle) 2929 os.remove(filename) 2930 if encoding != 'us-ascii': 2931 data = unicode(data, encoding) 2932 return canonicalize(data)29332935 """Writes element out and checks whether it is expected. 2936 2937 Does this two ways; once using StringIO, once using a real file. 2938 """ 2939 self.assertEquals(expected, self._writeElement(element, encoding)) 2940 self.assertEquals(expected, self._writeElementFile(element, encoding))29412943 "Checks if the result XML byte string specifies the encoding." 2944 has_encoding = re.compile(r"<\?xml[^>]+ encoding=[\"']([^\"']+)[\"']").match 2945 self.assert_(has_encoding(result)) 2946 result_encoding = has_encoding(result).group(1) 2947 self.assertEquals(result_encoding.upper(), encoding.upper())2948 2951 29542956 self.assert_(hasattr(element, 'tag')) 2957 self.assert_(hasattr(element, 'attrib')) 2958 self.assert_(hasattr(element, 'text')) 2959 self.assert_(hasattr(element, 'tail')) 2960 self._check_string(element.tag) 2961 self._check_mapping(element.attrib) 2962 if element.text != None: 2963 self._check_string(element.text) 2964 if element.tail != None: 2965 self._check_string(element.tail)29662968 len(string) 2969 for char in string: 2970 self.assertEquals(1, len(char)) 2971 new_string = string + "" 2972 new_string = string + " " 2973 string[:0]29742976 len(mapping) 2977 keys = mapping.keys() 2978 items = mapping.items() 2979 for key in keys: 2980 item = mapping[key] 2981 mapping["key"] = "value" 2982 self.assertEquals("value", mapping["key"])2983 2984 # assertFalse doesn't exist in Python 2.3 2985 try: 2986 unittest.TestCase.assertFalse 2987 except AttributeError: 2988 assertFalse = unittest.TestCase.failIf 2989 2990 2991 if etree: 2994 2995 if ElementTree: 2998 2999 if cElementTree: 30023004 suite = unittest.TestSuite() 3005 if etree: 3006 suite.addTests([unittest.makeSuite(ETreeTestCase)]) 3007 if ElementTree: 3008 suite.addTests([unittest.makeSuite(ElementTreeTestCase)]) 3009 if cElementTree: 3010 suite.addTests([unittest.makeSuite(CElementTreeTestCase)]) 3011 return suite3012 3013 if __name__ == '__main__': 3014 print 'to test use test.py %s' % __file__ 3015
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0beta1 on Sun Oct 7 07:08:38 2007 | http://epydoc.sourceforge.net |