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 12 import os, re, tempfile, copy, operator, gc, sys 13 14 this_dir = os.path.dirname(__file__) 15 if this_dir not in sys.path: 16 sys.path.insert(0, this_dir) # needed for Py3 17 18 from common_imports import StringIO, BytesIO, etree 19 from common_imports import ElementTree, cElementTree, ET_VERSION, CET_VERSION 20 from common_imports import filter_by_version, fileInTestDir, canonicalize, HelperTestCase 21 from common_imports import _str, _bytes 22 23 if cElementTree is not None and CET_VERSION <= (1,0,7): 24 cElementTree = None 25 26 if ElementTree is not None: 27 print("Comparing with ElementTree %s" % getattr(ElementTree, "VERSION", "?")) 28 29 if cElementTree is not None: 30 print("Comparing with cElementTree %s" % getattr(cElementTree, "VERSION", "?")) 31 32 try: 33 reversed 34 except NameError: 35 # Python 2.3 3941 etree = None 42 required_versions_ET = {} 43 required_versions_cET = {} 4422246 for i in range(10): 47 e = self.etree.Element('foo') 48 self.assertEquals(e.tag, 'foo') 49 self.assertEquals(e.text, None) 50 self.assertEquals(e.tail, None)5153 Element = self.etree.Element 54 55 root = Element('root') 56 root.append(Element('one')) 57 root.append(Element('two')) 58 root.append(Element('three')) 59 self.assertEquals(3, len(root)) 60 self.assertEquals('one', root[0].tag) 61 self.assertEquals('two', root[1].tag) 62 self.assertEquals('three', root[2].tag) 63 self.assertRaises(IndexError, operator.getitem, root, 3)64 65 # test weird dictionary interaction leading to segfault previously67 root = self.etree.Element('root') 68 self.assertEquals(root.tag, "root") 69 add = self.etree.ElementTree(file=BytesIO('<foo>Foo</foo>')) 70 self.assertEquals(add.getroot().tag, "foo") 71 self.assertEquals(add.getroot().text, "Foo") 72 root.append(self.etree.Element('baz')) 73 self.assertEquals(root.tag, "root") 74 self.assertEquals(root[0].tag, "baz")7577 Element = self.etree.Element 78 SubElement = self.etree.SubElement 79 80 root = Element('root') 81 SubElement(root, 'one') 82 SubElement(root, 'two') 83 SubElement(root, 'three') 84 self.assertEquals(3, len(root)) 85 self.assertEquals('one', root[0].tag) 86 self.assertEquals('two', root[1].tag) 87 self.assertEquals('three', root[2].tag)8890 Element = self.etree.Element 91 SubElement = self.etree.SubElement 92 93 root1 = Element('root') 94 SubElement(root1, 'one') 95 self.assert_(root1[0] in root1) 96 97 root2 = Element('root') 98 SubElement(root2, 'two') 99 SubElement(root2, 'three') 100 self.assert_(root2[0] in root2) 101 self.assert_(root2[1] in root2) 102 103 self.assertFalse(root1[0] in root2) 104 self.assertFalse(root2[0] in root1) 105 self.assertFalse(None in root2)106108 ElementTree = self.etree.ElementTree 109 110 f = BytesIO('<doc>Test<one>One</one></doc>') 111 doc = ElementTree(file=f) 112 root = doc.getroot() 113 self.assertEquals(1, len(root)) 114 self.assertEquals('one', root[0].tag) 115 self.assertRaises(IndexError, operator.getitem, root, 1)116118 ElementTree = self.etree.ElementTree 119 120 f = BytesIO('<doc><one>One</one><two>Two</two>hm<three>Three</three></doc>') 121 doc = ElementTree(file=f) 122 root = doc.getroot() 123 self.assertEquals(3, len(root)) 124 self.assertEquals('one', root[0].tag) 125 self.assertEquals('two', root[1].tag) 126 self.assertEquals('three', root[2].tag)127129 ElementTree = self.etree.ElementTree 130 131 f = BytesIO('<doc>Test</doc>') 132 doc = ElementTree(file=f) 133 root = doc.getroot() 134 self.assertEquals(0, len(root))135137 Element = self.etree.Element 138 SubElement = self.etree.SubElement 139 a = Element('a') 140 b = SubElement(a, 'b') 141 c = SubElement(a, 'c') 142 d = SubElement(a, 'd') 143 self.assertEquals(d, a[-1]) 144 self.assertEquals(c, a[-2]) 145 self.assertEquals(b, a[-3]) 146 self.assertRaises(IndexError, operator.getitem, a, -4) 147 a[-1] = e = Element('e') 148 self.assertEquals(e, a[-1]) 149 del a[-1] 150 self.assertEquals(2, len(a))151153 ElementTree = self.etree.ElementTree 154 155 f = BytesIO('<doc><one>One</one><two>Two</two></doc>') 156 doc = ElementTree(file=f) 157 root = doc.getroot() 158 self.assertEquals(2, len(root)) 159 self.assertEquals('one', root[0].tag) 160 self.assertEquals('two', root[1].tag)161163 ElementTree = self.etree.ElementTree 164 165 f = BytesIO('<doc>This is a text</doc>') 166 doc = ElementTree(file=f) 167 root = doc.getroot() 168 self.assertEquals('This is a text', root.text)169171 ElementTree = self.etree.ElementTree 172 173 f = BytesIO('<doc></doc>') 174 doc = ElementTree(file=f) 175 root = doc.getroot() 176 self.assertEquals(None, root.text)177179 ElementTree = self.etree.ElementTree 180 181 f = BytesIO('<doc><one>One</one></doc>') 182 doc = ElementTree(file=f) 183 root = doc.getroot() 184 self.assertEquals(None, root.text) 185 self.assertEquals('One', root[0].text)186188 ElementTree = self.etree.ElementTree 189 190 f = BytesIO('<doc>This is > than a text</doc>') 191 doc = ElementTree(file=f) 192 root = doc.getroot() 193 self.assertEquals('This is > than a text', root.text)194196 Element = self.etree.Element 197 198 a = Element("a") 199 a.text = "<>&" 200 self.assertXML(_bytes('<a><>&</a>'), 201 a)202204 tostring = self.etree.tostring 205 Element = self.etree.Element 206 207 a = Element("a") 208 a.text = "<>&" 209 self.assertEquals(_bytes('<a><>&</a>'), 210 tostring(a))211 217 218 a = Element("a") 219 a.text = strTest("text") 220 self.assertXML(_bytes('<a>text</a>'), 221 a)224 ElementTree = self.etree.ElementTree 225 226 f = BytesIO('<doc>This is <i>mixed</i> content.</doc>') 227 doc = ElementTree(file=f) 228 root = doc.getroot() 229 self.assertEquals(1, len(root)) 230 self.assertEquals('This is ', root.text) 231 self.assertEquals(None, root.tail) 232 self.assertEquals('mixed', root[0].text) 233 self.assertEquals(' content.', root[0].tail)234236 Element = self.etree.Element 237 SubElement = self.etree.SubElement 238 239 class strTest(str): 240 pass241 242 a = Element("a") 243 SubElement(a, "t").tail = strTest("tail") 244 self.assertXML(_bytes('<a><t></t>tail</a>'), 245 a) 246248 # this is discouraged for ET compat, should not be tested... 249 XML = self.etree.XML 250 251 root = XML(_bytes('<doc>This is <i>mixed</i> content.</doc>')) 252 self.assertEquals(1, len(root)) 253 self.assertEquals('This is ', root.text) 254 self.assertEquals(None, root.tail) 255 self.assertEquals('mixed', root[0].text) 256 self.assertEquals(' content.', root[0].tail) 257 258 del root[0].tail 259 260 self.assertEquals(1, len(root)) 261 self.assertEquals('This is ', root.text) 262 self.assertEquals(None, root.tail) 263 self.assertEquals('mixed', root[0].text) 264 self.assertEquals(None, root[0].tail) 265 266 root[0].tail = "TAIL" 267 268 self.assertEquals(1, len(root)) 269 self.assertEquals('This is ', root.text) 270 self.assertEquals(None, root.tail) 271 self.assertEquals('mixed', root[0].text) 272 self.assertEquals('TAIL', root[0].tail)273275 Element = self.etree.Element 276 ElementTree = self.etree.ElementTree 277 278 el = Element('hoi') 279 doc = ElementTree(el) 280 root = doc.getroot() 281 self.assertEquals(None, root.text) 282 self.assertEquals('hoi', root.tag)283285 ElementTree = self.etree.ElementTree 286 287 f = BytesIO('<doc one="One" two="Two"/>') 288 doc = ElementTree(file=f) 289 root = doc.getroot() 290 self.assertEquals('One', root.attrib['one']) 291 self.assertEquals('Two', root.attrib['two']) 292 self.assertRaises(KeyError, operator.getitem, root.attrib, 'three')293295 ElementTree = self.etree.ElementTree 296 297 f = BytesIO('<doc one="One" two="Two"/>') 298 doc = ElementTree(file=f) 299 root = doc.getroot() 300 self.assertEquals('One', root.attrib.get('one')) 301 self.assertEquals('Two', root.attrib.get('two')) 302 self.assertEquals(None, root.attrib.get('three')) 303 self.assertEquals('foo', root.attrib.get('three', 'foo'))304306 ElementTree = self.etree.ElementTree 307 308 f = BytesIO('<doc one="One" two="Two"/>') 309 doc = ElementTree(file=f) 310 root = doc.getroot() 311 self.assertEquals('One', root.get('one')) 312 self.assertEquals('Two', root.get('two')) 313 self.assertEquals(None, root.get('three')) 314 self.assertEquals('foo', root.get('three', 'foo'))315317 XML = self.etree.XML 318 319 root = XML(_bytes('<doc one="One" two="Two"/>')) 320 self.assertEquals('One', root.get('one')) 321 self.assertEquals('Two', root.get('two')) 322 root.attrib.clear() 323 self.assertEquals(None, root.get('one')) 324 self.assertEquals(None, root.get('two'))325327 Element = self.etree.Element 328 329 root = Element("root", one="One") 330 root.set("two", "Two") 331 self.assertEquals('One', root.get('one')) 332 self.assertEquals('Two', root.get('two')) 333 root.attrib.clear() 334 self.assertEquals(None, root.get('one')) 335 self.assertEquals(None, root.get('two'))336338 Element = self.etree.Element 339 SubElement = self.etree.SubElement 340 341 attribNS = '{http://foo/bar}x' 342 343 parent = Element('parent') 344 parent.set(attribNS, 'a') 345 child = SubElement(parent, 'child') 346 child.set(attribNS, 'b') 347 348 self.assertEquals('a', parent.get(attribNS)) 349 self.assertEquals('b', child.get(attribNS)) 350 351 parent.clear() 352 self.assertEquals(None, parent.get(attribNS)) 353 self.assertEquals('b', child.get(attribNS))354356 ElementTree = self.etree.ElementTree 357 358 f = BytesIO('<doc one="One" two="Two"/>') 359 doc = ElementTree(file=f) 360 root = doc.getroot() 361 self.assertEquals('One', root.attrib['one']) 362 self.assertEquals('Two', root.attrib['two']) 363 364 self.assertEquals('One', root.attrib.pop('one')) 365 366 self.assertEquals(None, root.attrib.get('one')) 367 self.assertEquals('Two', root.attrib['two'])368370 root = self.etree.XML(_bytes('<doc one="One" two="Two"/>')) 371 self.assertRaises(KeyError, root.attrib.pop, 'NONE') 372 373 self.assertEquals('One', root.attrib['one']) 374 self.assertEquals('Two', root.attrib['two'])375377 root = self.etree.XML(_bytes('<doc one="One" two="Two"/>')) 378 self.assertEquals('Three', root.attrib.pop('three', 'Three'))379381 root = self.etree.XML(_bytes('<doc/>')) 382 self.assertEquals('Three', root.attrib.pop('three', 'Three'))383385 root = self.etree.XML(_bytes('<doc one="One" two="Two"/>')) 386 self.assertRaises(TypeError, root.attrib.pop, 'One', None, None)387389 XML = self.etree.XML 390 391 root = XML(_bytes('<doc alpha="Alpha" beta="Beta"/>')) 392 items = list(root.attrib.items()) 393 items.sort() 394 self.assertEquals( 395 [('alpha', 'Alpha'), ('beta', 'Beta')], 396 items) 397 398 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}) 399 400 items = list(root.attrib.items()) 401 items.sort() 402 self.assertEquals( 403 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')], 404 items)405407 XML = self.etree.XML 408 409 root = XML(_bytes('<doc alpha="Alpha" beta="Beta"/>')) 410 items = list(root.attrib.items()) 411 items.sort() 412 self.assertEquals( 413 [('alpha', 'Alpha'), ('beta', 'Beta')], 414 items) 415 416 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.items()) 417 418 items = list(root.attrib.items()) 419 items.sort() 420 self.assertEquals( 421 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')], 422 items)423425 XML = self.etree.XML 426 427 root = XML(_bytes('<doc alpha="Alpha" beta="Beta"/>')) 428 items = list(root.attrib.items()) 429 items.sort() 430 self.assertEquals( 431 [('alpha', 'Alpha'), ('beta', 'Beta')], 432 items) 433 434 root.attrib.update({'alpha' : 'test', 'gamma' : 'Gamma'}.items()) 435 436 items = list(root.attrib.items()) 437 items.sort() 438 self.assertEquals( 439 [('alpha', 'test'), ('beta', 'Beta'), ('gamma', 'Gamma')], 440 items)441443 XML = self.etree.XML 444 445 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 446 keys = list(root.attrib.keys()) 447 keys.sort() 448 self.assertEquals(['alpha', 'beta', 'gamma'], keys)449451 XML = self.etree.XML 452 453 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 454 keys = list(root.keys()) 455 keys.sort() 456 self.assertEquals(['alpha', 'beta', 'gamma'], keys)457459 XML = self.etree.XML 460 461 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 462 items = list(root.items()) 463 items.sort() 464 self.assertEquals( 465 [('alpha','Alpha'), ('beta','Beta'), ('gamma','Gamma')], 466 items)467469 XML = self.etree.XML 470 471 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 472 keys = list(root.keys()) 473 keys.sort() 474 self.assertEquals(['bar', '{http://ns.codespeak.net/test}baz'], 475 keys)476478 XML = self.etree.XML 479 480 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 481 values = list(root.attrib.values()) 482 values.sort() 483 self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)484486 XML = self.etree.XML 487 488 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 489 values = list(root.attrib.values()) 490 values.sort() 491 self.assertEquals( 492 ['Bar', 'Baz'], values)493495 XML = self.etree.XML 496 497 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')) 498 items = list(root.attrib.items()) 499 items.sort() 500 self.assertEquals([ 501 ('alpha', 'Alpha'), 502 ('beta', 'Beta'), 503 ('gamma', 'Gamma'), 504 ], 505 items)506508 XML = self.etree.XML 509 510 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 511 items = list(root.attrib.items()) 512 items.sort() 513 self.assertEquals( 514 [('bar', 'Bar'), ('{http://ns.codespeak.net/test}baz', 'Baz')], 515 items)516518 XML = self.etree.XML 519 520 expected = "{'{http://ns.codespeak.net/test}baz': 'Baz', 'bar': 'Bar'}" 521 alternative = "{'bar': 'Bar', '{http://ns.codespeak.net/test}baz': 'Baz'}" 522 523 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 524 try: 525 self.assertEquals(expected, str(root.attrib)) 526 except AssertionError: 527 self.assertEquals(alternative, str(root.attrib))528530 XML = self.etree.XML 531 532 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 533 self.assertEquals( 534 True, root.attrib.has_key('bar')) 535 self.assertEquals( 536 False, root.attrib.has_key('baz')) 537 self.assertEquals( 538 False, root.attrib.has_key('hah')) 539 self.assertEquals( 540 True, 541 root.attrib.has_key('{http://ns.codespeak.net/test}baz'))542544 XML = self.etree.XML 545 546 root = XML(_bytes('<foo bar="Bar" xmlns:ns="http://ns.codespeak.net/test" ns:baz="Baz" />')) 547 self.assertEquals( 548 True, 'bar' in root.attrib) 549 self.assertEquals( 550 False, 'baz' in root.attrib) 551 self.assertEquals( 552 False, 'hah' in root.attrib) 553 self.assertEquals( 554 True, 555 '{http://ns.codespeak.net/test}baz' in root.attrib)556558 Element = self.etree.Element 559 560 root = Element("root") 561 root.set("attr", "TEST") 562 self.assertEquals("TEST", root.get("attr"))563565 XML = self.etree.XML 566 567 root = XML(_bytes('<doc alpha="Alpha" beta="Beta" gamma="Gamma" />')) 568 result = [] 569 for key in root.attrib: 570 result.append(key) 571 result.sort() 572 self.assertEquals(['alpha', 'beta', 'gamma'], result)573575 Element = self.etree.Element 576 577 a = Element('a') 578 a.attrib['foo'] = 'Foo' 579 a.attrib['bar'] = 'Bar' 580 self.assertEquals('Foo', a.attrib['foo']) 581 del a.attrib['foo'] 582 self.assertRaises(KeyError, operator.getitem, a.attrib, 'foo')583585 Element = self.etree.Element 586 587 a = Element('a') 588 a.attrib['{http://a/}foo'] = 'Foo' 589 a.attrib['{http://a/}bar'] = 'Bar' 590 self.assertEquals(None, a.get('foo')) 591 self.assertEquals('Foo', a.get('{http://a/}foo')) 592 self.assertEquals('Foo', a.attrib['{http://a/}foo']) 593 594 self.assertRaises(KeyError, operator.delitem, a.attrib, 'foo') 595 self.assertEquals('Foo', a.attrib['{http://a/}foo']) 596 597 del a.attrib['{http://a/}foo'] 598 self.assertRaises(KeyError, operator.getitem, a.attrib, 'foo')599601 XML = self.etree.XML 602 603 a = XML(_bytes('<a xmlns:nsa="http://a/" nsa:foo="FooNS" foo="Foo" />')) 604 605 self.assertEquals('Foo', a.attrib['foo']) 606 self.assertEquals('FooNS', a.attrib['{http://a/}foo']) 607 608 del a.attrib['foo'] 609 self.assertEquals('FooNS', a.attrib['{http://a/}foo']) 610 self.assertRaises(KeyError, operator.getitem, a.attrib, 'foo') 611 self.assertRaises(KeyError, operator.delitem, a.attrib, 'foo') 612 613 del a.attrib['{http://a/}foo'] 614 self.assertRaises(KeyError, operator.getitem, a.attrib, '{http://a/}foo') 615 self.assertRaises(KeyError, operator.getitem, a.attrib, 'foo') 616 617 a = XML(_bytes('<a xmlns:nsa="http://a/" foo="Foo" nsa:foo="FooNS" />')) 618 619 self.assertEquals('Foo', a.attrib['foo']) 620 self.assertEquals('FooNS', a.attrib['{http://a/}foo']) 621 622 del a.attrib['foo'] 623 self.assertEquals('FooNS', a.attrib['{http://a/}foo']) 624 self.assertRaises(KeyError, operator.getitem, a.attrib, 'foo') 625 626 del a.attrib['{http://a/}foo'] 627 self.assertRaises(KeyError, operator.getitem, a.attrib, '{http://a/}foo') 628 self.assertRaises(KeyError, operator.getitem, a.attrib, 'foo')629631 XML = self.etree.XML 632 633 root = XML(_bytes('<doc>This is a text.</doc>')) 634 self.assertEquals(0, len(root)) 635 self.assertEquals('This is a text.', root.text)636638 XMLID = self.etree.XMLID 639 XML = self.etree.XML 640 xml_text = _bytes(''' 641 <document> 642 <h1 id="chapter1">...</h1> 643 <p id="note1" class="note">...</p> 644 <p>Regular paragraph.</p> 645 <p xml:id="xmlid">XML:ID paragraph.</p> 646 <p id="warn1" class="warning">...</p> 647 </document> 648 ''') 649 650 root, dic = XMLID(xml_text) 651 root2 = XML(xml_text) 652 self.assertEquals(self._writeElement(root), 653 self._writeElement(root2)) 654 expected = { 655 "chapter1" : root[0], 656 "note1" : root[1], 657 "warn1" : root[4] 658 } 659 self.assertEquals(dic, expected)660662 fromstring = self.etree.fromstring 663 664 root = fromstring('<doc>This is a text.</doc>') 665 self.assertEquals(0, len(root)) 666 self.assertEquals('This is a text.', root.text)667 668 required_versions_ET['test_fromstringlist'] = (1,3)670 fromstringlist = self.etree.fromstringlist 671 672 root = fromstringlist(["<do", "c>T", "hi", "s is", 673 " a text.<", "/doc", ">"]) 674 self.assertEquals(0, len(root)) 675 self.assertEquals('This is a text.', root.text)676 677 required_versions_ET['test_fromstringlist_characters'] = (1,3)679 fromstringlist = self.etree.fromstringlist 680 681 root = fromstringlist(list('<doc>This is a text.</doc>')) 682 self.assertEquals(0, len(root)) 683 self.assertEquals('This is a text.', root.text)684 685 required_versions_ET['test_fromstringlist_single'] = (1,3)687 fromstringlist = self.etree.fromstringlist 688 689 root = fromstringlist(['<doc>This is a text.</doc>']) 690 self.assertEquals(0, len(root)) 691 self.assertEquals('This is a text.', root.text)692694 iselement = self.etree.iselement 695 Element = self.etree.Element 696 ElementTree = self.etree.ElementTree 697 XML = self.etree.XML 698 Comment = self.etree.Comment 699 ProcessingInstruction = self.etree.ProcessingInstruction 700 701 el = Element('hoi') 702 self.assert_(iselement(el)) 703 704 el2 = XML(_bytes('<foo/>')) 705 self.assert_(iselement(el2)) 706 707 tree = ElementTree(element=Element('dag')) 708 self.assert_(not iselement(tree)) 709 self.assert_(iselement(tree.getroot())) 710 711 c = Comment('test') 712 self.assert_(iselement(c)) 713 714 p = ProcessingInstruction("test", "some text") 715 self.assert_(iselement(p))716718 XML = self.etree.XML 719 720 root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>')) 721 result = [] 722 for el in root: 723 result.append(el.tag) 724 self.assertEquals(['one', 'two', 'three'], result)725727 XML = self.etree.XML 728 729 root = XML(_bytes('<doc></doc>')) 730 result = [] 731 for el in root: 732 result.append(el.tag) 733 self.assertEquals([], result)734736 XML = self.etree.XML 737 738 root = XML(_bytes('<doc>Text</doc>')) 739 result = [] 740 for el in root: 741 result.append(el.tag) 742 self.assertEquals([], result)743745 # this would cause a crash in the past 746 fromstring = self.etree.fromstring 747 root = etree.fromstring('<html><p></p>x</html>') 748 for elem in root: 749 elem.tail = ''750752 XML = self.etree.XML 753 root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>')) 754 result = [] 755 for el in reversed(root): 756 result.append(el.tag) 757 self.assertEquals(['three', 'two', 'one'], result)758760 XML = self.etree.XML 761 762 root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>')) 763 result = [] 764 add = True 765 for el in root: 766 result.append(el.tag) 767 if add: 768 self.etree.SubElement(root, 'four') 769 add = False 770 self.assertEquals(['one', 'two', 'three', 'four'], result)771773 XML = self.etree.XML 774 775 root = XML(_bytes('<doc><one/><two>Two</two>Hm<three/></doc>')) 776 result = [] 777 for el in root: 778 result.append(el.tag) 779 del root[-1] 780 self.assertEquals(['one', 'two'], result)781783 XML = self.etree.XML 784 785 root = XML(_bytes('<doc><one/><two/></doc>')) 786 result = [] 787 for el0 in root: 788 result.append(el0.tag) 789 for el1 in root: 790 result.append(el1.tag) 791 self.assertEquals(['one','one', 'two', 'two', 'one', 'two'], result)792 793 required_versions_ET['test_itertext'] = (1,3)795 # ET 1.3+ 796 XML = self.etree.XML 797 root = XML(_bytes("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")) 798 799 text = list(root.itertext()) 800 self.assertEquals(["RTEXT", "ATAIL", "CTEXT", "CTAIL"], 801 text)802 803 required_versions_ET['test_itertext_child'] = (1,3)805 # ET 1.3+ 806 XML = self.etree.XML 807 root = XML(_bytes("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")) 808 809 text = list(root[2].itertext()) 810 self.assertEquals(["CTEXT"], 811 text)812814 XML = self.etree.XML 815 root = XML(_bytes('<a><b><c/></b><b/><c><b/></c></a>')) 816 self.assertEquals(len(list(root.findall("c"))), 1) 817 self.assertEquals(len(list(root.findall(".//c"))), 2) 818 self.assertEquals(len(list(root.findall(".//b"))), 3) 819 self.assertEquals(len(list(root.findall(".//b"))[0]), 1) 820 self.assertEquals(len(list(root.findall(".//b"))[1]), 0) 821 self.assertEquals(len(list(root.findall(".//b"))[2]), 0)822824 XML = self.etree.XML 825 root = XML(_bytes('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')) 826 self.assertEquals(len(list(root.findall(".//{X}b"))), 2) 827 self.assertEquals(len(list(root.findall(".//b"))), 3) 828 self.assertEquals(len(list(root.findall("b"))), 2)829831 Element = self.etree.Element 832 833 el = Element('tag', foo='Foo', bar='Bar') 834 self.assertEquals('Foo', el.attrib['foo']) 835 self.assertEquals('Bar', el.attrib['bar'])836838 Element = self.etree.Element 839 840 el = Element('tag', {'foo':'Foo', 'bar':'Bar'}) 841 self.assertEquals('Foo', el.attrib['foo']) 842 self.assertEquals('Bar', el.attrib['bar'])843845 Element = self.etree.Element 846 847 el = Element('tag', {'{ns1}foo':'Foo', '{ns2}bar':'Bar'}) 848 self.assertEquals('Foo', el.attrib['{ns1}foo']) 849 self.assertEquals('Bar', el.attrib['{ns2}bar'])850852 Element = self.etree.Element 853 SubElement = self.etree.SubElement 854 855 el = Element('tag') 856 SubElement(el, 'foo', {'foo':'Foo'}, baz="Baz") 857 self.assertEquals("Baz", el[0].attrib['baz']) 858 self.assertEquals('Foo', el[0].attrib['foo'])859861 Element = self.etree.Element 862 SubElement = self.etree.SubElement 863 864 el = Element('tag') 865 SubElement(el, 'foo', {'{ns1}foo':'Foo', '{ns2}bar':'Bar'}) 866 self.assertEquals('Foo', el[0].attrib['{ns1}foo']) 867 self.assertEquals('Bar', el[0].attrib['{ns2}bar'])868870 ElementTree = self.etree.ElementTree 871 XML = self.etree.XML 872 873 for i in range(10): 874 f = BytesIO() 875 root = XML(_bytes('<doc%s>This is a test.</doc%s>' % (i, i))) 876 tree = ElementTree(element=root) 877 tree.write(f) 878 data = f.getvalue() 879 self.assertEquals( 880 _bytes('<doc%s>This is a test.</doc%s>' % (i, i)), 881 canonicalize(data))882 883 required_versions_ET['test_write_method_html'] = (1,3)885 ElementTree = self.etree.ElementTree 886 Element = self.etree.Element 887 SubElement = self.etree.SubElement 888 889 html = Element('html') 890 body = SubElement(html, 'body') 891 p = SubElement(body, 'p') 892 p.text = "html" 893 SubElement(p, 'br').tail = "test" 894 895 tree = ElementTree(element=html) 896 f = BytesIO() 897 tree.write(f, method="html") 898 data = f.getvalue().replace(_bytes('\n'),_bytes('')) 899 900 self.assertEquals(_bytes('<html><body><p>html<br>test</p></body></html>'), 901 data)902 903 required_versions_ET['test_write_method_text'] = (1,3)905 ElementTree = self.etree.ElementTree 906 Element = self.etree.Element 907 SubElement = self.etree.SubElement 908 909 a = Element('a') 910 a.text = "A" 911 a.tail = "tail" 912 b = SubElement(a, 'b') 913 b.text = "B" 914 b.tail = "TAIL" 915 c = SubElement(a, 'c') 916 c.text = "C" 917 918 tree = ElementTree(element=a) 919 f = BytesIO() 920 tree.write(f, method="text") 921 data = f.getvalue() 922 923 self.assertEquals(_bytes('ABTAILCtail'), 924 data)925927 ElementTree = self.etree.ElementTree 928 XML = self.etree.XML 929 930 tree = ElementTree( XML(_bytes('<doc>This is a test.</doc>')) ) 931 self.assertRaises(IOError, tree.write, 932 "definitely////\\-\\nonexisting\\-\\////FILE")933 934 # this could trigger a crash, apparently because the document 935 # reference was prematurely garbage collected937 Element = self.etree.Element 938 939 element = Element('tag') 940 for i in range(10): 941 element.attrib['key'] = 'value' 942 value = element.attrib['key'] 943 self.assertEquals(value, 'value')944 945 # from doctest; for some reason this caused crashes too947 Element = self.etree.Element 948 ElementTree = self.etree.ElementTree 949 950 f = BytesIO() 951 for i in range(10): 952 element = Element('tag%s' % i) 953 self._check_element(element) 954 tree = ElementTree(element) 955 tree.write(f) 956 self._check_element_tree(tree)957959 Element = self.etree.Element 960 SubElement = self.etree.SubElement 961 962 el = Element('foo') 963 el2 = SubElement(el, 'bar') 964 el3 = SubElement(el2, 'baz') 965 966 al = Element('foo2') 967 al2 = SubElement(al, 'bar2') 968 al3 = SubElement(al2, 'baz2') 969 970 # now move al2 into el 971 el.append(al2) 972 973 # now change al3 directly 974 al3.text = 'baz2-modified' 975 976 # it should have changed through this route too 977 self.assertEquals( 978 'baz2-modified', 979 el[1][0].text)980982 Element = self.etree.Element 983 SubElement = self.etree.SubElement 984 985 a = Element('a') 986 b = SubElement(a, 'b') 987 a.text = 'hoi' 988 self.assertEquals( 989 'hoi', 990 a.text) 991 self.assertEquals( 992 'b', 993 a[0].tag)994996 Element = self.etree.Element 997 SubElement = self.etree.SubElement 998 999 a = Element('a') 1000 a.text = 'hoi' 1001 b = SubElement(a ,'b') 1002 self.assertEquals( 1003 'hoi', 1004 a.text) 1005 self.assertEquals( 1006 'b', 1007 a[0].tag)10081010 Element = self.etree.Element 1011 1012 a = Element('a') 1013 1014 a.text = 'foo' 1015 a.text = None 1016 1017 self.assertEquals( 1018 None, 1019 a.text) 1020 self.assertXML(_bytes('<a></a>'), a)10211023 Element = self.etree.Element 1024 1025 a = Element('a') 1026 self.assertEquals(None, a.text) 1027 1028 a.text = '' 1029 self.assertEquals('', a.text) 1030 self.assertXML(_bytes('<a></a>'), a)10311033 Element = self.etree.Element 1034 SubElement = self.etree.SubElement 1035 1036 a = Element('a') 1037 a.tail = 'dag' 1038 self.assertEquals('dag', 1039 a.tail) 1040 b = SubElement(a, 'b') 1041 b.tail = 'hoi' 1042 self.assertEquals('hoi', 1043 b.tail) 1044 self.assertEquals('dag', 1045 a.tail)10461048 Element = self.etree.Element 1049 1050 a = Element('a') 1051 b = Element('b') 1052 b.tail = 'b_tail' 1053 a.append(b) 1054 self.assertEquals('b_tail', 1055 b.tail)10561058 Element = self.etree.Element 1059 SubElement = self.etree.SubElement 1060 1061 a = Element('a') 1062 b = SubElement(a, 'b') 1063 b.tail = 'foo' 1064 b.tail = 'bar' 1065 self.assertEquals('bar', 1066 b.tail) 1067 self.assertXML(_bytes('<a><b></b>bar</a>'), a)10681070 Element = self.etree.Element 1071 a = Element('a') 1072 a.tail = 'foo' 1073 a.tail = None 1074 self.assertEquals( 1075 None, 1076 a.tail) 1077 self.assertXML(_bytes('<a></a>'), a)1078 1079 required_versions_ET['test_extend'] = (1,3)1081 root = self.etree.Element('foo') 1082 for i in range(3): 1083 element = self.etree.SubElement(root, 'a%s' % i) 1084 element.text = "text%d" % i 1085 element.tail = "tail%d" % i 1086 1087 elements = [] 1088 for i in range(3): 1089 new_element = self.etree.Element("test%s" % i) 1090 new_element.text = "TEXT%s" % i 1091 new_element.tail = "TAIL%s" % i 1092 elements.append(new_element) 1093 1094 root.extend(elements) 1095 1096 self.assertEquals( 1097 ["a0", "a1", "a2", "test0", "test1", "test2"], 1098 [ el.tag for el in root ]) 1099 self.assertEquals( 1100 ["text0", "text1", "text2", "TEXT0", "TEXT1", "TEXT2"], 1101 [ el.text for el in root ]) 1102 self.assertEquals( 1103 ["tail0", "tail1", "tail2", "TAIL0", "TAIL1", "TAIL2"], 1104 [ el.tail for el in root ])11051107 Element = self.etree.Element 1108 SubElement = self.etree.SubElement 1109 Comment = self.etree.Comment 1110 1111 a = Element('a') 1112 a.append(Comment('foo')) 1113 self.assertEquals(a[0].tag, Comment) 1114 self.assertEquals(a[0].text, 'foo')1115 1116 # ElementTree < 1.3 adds whitespace around comments 1117 required_versions_ET['test_comment_text'] = (1,3)1119 Element = self.etree.Element 1120 SubElement = self.etree.SubElement 1121 Comment = self.etree.Comment 1122 tostring = self.etree.tostring 1123 1124 a = Element('a') 1125 a.append(Comment('foo')) 1126 self.assertEquals(a[0].text, 'foo') 1127 1128 self.assertEquals( 1129 _bytes('<a><!--foo--></a>'), 1130 tostring(a)) 1131 1132 a[0].text = "TEST" 1133 self.assertEquals(a[0].text, 'TEST') 1134 1135 self.assertEquals( 1136 _bytes('<a><!--TEST--></a>'), 1137 tostring(a))1138 1139 # ElementTree < 1.3 adds whitespace around comments 1140 required_versions_ET['test_comment_whitespace'] = (1,3)1142 Element = self.etree.Element 1143 SubElement = self.etree.SubElement 1144 Comment = self.etree.Comment 1145 tostring = self.etree.tostring 1146 1147 a = Element('a') 1148 a.append(Comment(' foo ')) 1149 self.assertEquals(a[0].text, ' foo ') 1150 self.assertEquals( 1151 _bytes('<a><!-- foo --></a>'), 1152 tostring(a))11531155 Comment = self.etree.Comment 1156 c = Comment('foo') 1157 self.assertEquals({}, c.attrib) 1158 self.assertEquals([], list(c.keys())) 1159 self.assertEquals([], list(c.items())) 1160 self.assertEquals(None, c.get('hoi')) 1161 self.assertEquals(0, len(c)) 1162 # should not iterate 1163 for i in c: 1164 pass11651167 # lxml.etree separates target and text 1168 Element = self.etree.Element 1169 SubElement = self.etree.SubElement 1170 ProcessingInstruction = self.etree.ProcessingInstruction 1171 1172 a = Element('a') 1173 a.append(ProcessingInstruction('foo', 'some more text')) 1174 self.assertEquals(a[0].tag, ProcessingInstruction) 1175 self.assertXML(_bytes("<a><?foo some more text?></a>"), 1176 a)11771179 # lxml.etree separates target and text 1180 Element = self.etree.Element 1181 SubElement = self.etree.SubElement 1182 ProcessingInstruction = self.etree.PI 1183 1184 a = Element('a') 1185 a.append(ProcessingInstruction('foo', 'some more text')) 1186 self.assertEquals(a[0].tag, ProcessingInstruction) 1187 self.assertXML(_bytes("<a><?foo some more text?></a>"), 1188 a)11891191 ProcessingInstruction = self.etree.ProcessingInstruction 1192 pi = ProcessingInstruction('foo') 1193 self.assertEquals({}, pi.attrib) 1194 self.assertEquals([], list(pi.keys())) 1195 self.assertEquals([], list(pi.items())) 1196 self.assertEquals(None, pi.get('hoi')) 1197 self.assertEquals(0, len(pi)) 1198 # should not iterate 1199 for i in pi: 1200 pass12011203 Element = self.etree.Element 1204 SubElement = self.etree.SubElement 1205 1206 a = Element('a') 1207 b = SubElement(a, 'b') 1208 c = Element('c') 1209 a[0] = c 1210 self.assertEquals( 1211 c, 1212 a[0]) 1213 self.assertXML(_bytes('<a><c></c></a>'), 1214 a) 1215 self.assertXML(_bytes('<b></b>'), 1216 b)12171219 Element = self.etree.Element 1220 SubElement = self.etree.SubElement 1221 1222 a = Element('a') 1223 for i in range(5): 1224 b = SubElement(a, 'b%s' % i) 1225 c = SubElement(b, 'c') 1226 for i in range(5): 1227 d = Element('d') 1228 e = SubElement(d, 'e') 1229 a[i] = d 1230 self.assertXML( 1231 _bytes('<a><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d><d><e></e></d></a>'), 1232 a) 1233 self.assertXML(_bytes('<c></c>'), 1234 c)12351237 Element = self.etree.Element 1238 SubElement = self.etree.SubElement 1239 1240 a = Element('a') 1241 SubElement(a, 'b') 1242 d = Element('d') 1243 a[0] = d 1244 self.assertXML(_bytes('<a><d></d></a>'), a)12451247 Element = self.etree.Element 1248 SubElement = self.etree.SubElement 1249 1250 a = Element('a') 1251 b = SubElement(a, 'b') 1252 1253 self.assertRaises(IndexError, operator.setitem, a, 1, Element('c'))12541256 Element = self.etree.Element 1257 SubElement = self.etree.SubElement 1258 1259 a = Element('a') 1260 b = SubElement(a, 'b') 1261 b.tail = 'B2' 1262 c = Element('c') 1263 c.tail = 'C2' 1264 1265 a[0] = c 1266 self.assertXML( 1267 _bytes('<a><c></c>C2</a>'), 1268 a)12691271 Element = self.etree.Element 1272 SubElement = self.etree.SubElement 1273 1274 a = Element('a') 1275 b = SubElement(a, 'b') 1276 1277 a.tag = 'c' 1278 1279 self.assertEquals( 1280 'c', 1281 a.tag) 1282 1283 self.assertXML( 1284 _bytes('<c><b></b></c>'), 1285 a)12861288 Element = self.etree.Element 1289 SubElement = self.etree.SubElement 1290 tostring = self.etree.tostring 1291 1292 a = Element('{a}a') 1293 b1 = SubElement(a, '{a}b') 1294 b2 = SubElement(a, '{b}b') 1295 1296 self.assertEquals('{a}b', b1.tag) 1297 1298 b1.tag = 'c' 1299 1300 # can't use C14N here! 1301 self.assertEquals('c', b1.tag) 1302 self.assertEquals(_bytes('<c'), tostring(b1)[:2]) 1303 self.assert_(_bytes('<c') in tostring(a))13041306 Element = self.etree.Element 1307 SubElement = self.etree.SubElement 1308 tostring = self.etree.tostring 1309 1310 a = Element('{a}a') 1311 b1 = SubElement(a, '{a}b') 1312 b2 = SubElement(a, '{b}b') 1313 1314 a.tag = 'c' 1315 1316 self.assertEquals( 1317 'c', 1318 a.tag) 1319 1320 # can't use C14N here! 1321 self.assertEquals('c', a.tag) 1322 self.assertEquals(_bytes('<c'), tostring(a)[:2])1323 1329 1330 a = Element("a") 1331 a.tag = strTest("TAG") 1332 self.assertXML(_bytes('<TAG></TAG>'), 1333 a) 13341336 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 d = SubElement(a, 'd') 1343 1344 del a[1] 1345 self.assertXML( 1346 _bytes('<a><b></b><d></d></a>'), 1347 a) 1348 1349 del a[0] 1350 self.assertXML( 1351 _bytes('<a><d></d></a>'), 1352 a) 1353 1354 del a[0] 1355 self.assertXML( 1356 _bytes('<a></a>'), 1357 a) 1358 # move deleted element into other tree afterwards 1359 other = Element('other') 1360 other.append(c) 1361 self.assertXML( 1362 _bytes('<other><c></c></other>'), 1363 other)13641366 Element = self.etree.Element 1367 SubElement = self.etree.SubElement 1368 1369 a = Element('a') 1370 b = SubElement(a, 'b') 1371 bs = SubElement(b, 'bs') 1372 c = SubElement(a, 'c') 1373 cs = SubElement(c, 'cs') 1374 1375 el = a[0] 1376 self.assertXML( 1377 _bytes('<a><b><bs></bs></b><c><cs></cs></c></a>'), 1378 a) 1379 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1380 self.assertXML(_bytes('<c><cs></cs></c>'), c) 1381 1382 del a[0] 1383 self.assertXML( 1384 _bytes('<a><c><cs></cs></c></a>'), 1385 a) 1386 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1387 self.assertXML(_bytes('<c><cs></cs></c>'), c) 1388 1389 a.insert(0, el) 1390 self.assertXML( 1391 _bytes('<a><b><bs></bs></b><c><cs></cs></c></a>'), 1392 a) 1393 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1394 self.assertXML(_bytes('<c><cs></cs></c>'), c)13951397 Element = self.etree.Element 1398 SubElement = self.etree.SubElement 1399 1400 a = Element('a') 1401 b = SubElement(a, 'b') 1402 bs = SubElement(b, 'bs') 1403 c = SubElement(a, 'c') 1404 cs = SubElement(c, 'cs') 1405 1406 el = a[0] 1407 del a[0] 1408 a[0] = el 1409 self.assertXML( 1410 _bytes('<a><b><bs></bs></b></a>'), 1411 a) 1412 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1413 self.assertXML(_bytes('<c><cs></cs></c>'), c)14141416 Element = self.etree.Element 1417 SubElement = self.etree.SubElement 1418 1419 a = Element('a') 1420 b = SubElement(a, 'b') 1421 bs = SubElement(b, 'bs') 1422 c = SubElement(a, 'c') 1423 cs = SubElement(c, 'cs') 1424 1425 el = a[0] 1426 del a[0] 1427 a[0:0] = [el] 1428 self.assertXML( 1429 _bytes('<a><b><bs></bs></b><c><cs></cs></c></a>'), 1430 a) 1431 self.assertXML(_bytes('<b><bs></bs></b>'), b) 1432 self.assertXML(_bytes('<c><cs></cs></c>'), c)14331435 XML = self.etree.XML 1436 a = XML(_bytes('<a><b></b>B2<c></c>C2</a>')) 1437 b, c = a 1438 1439 a[:] = [] 1440 1441 self.assertEquals("B2", b.tail) 1442 self.assertEquals("C2", c.tail)14431445 XML = self.etree.XML 1446 root = XML(_bytes( 1447 '<foo><bar xmlns:baz="http://huhu"><puh><baz:bump1 /><baz:bump2 /></puh></bar></foo>')) 1448 root[:] = root.findall('.//puh') # delete bar from hierarchy 1449 1450 # previously, this lost a namespace declaration on bump2 1451 result = self.etree.tostring(root) 1452 foo = self.etree.fromstring(result) 1453 1454 self.assertEquals('puh', foo[0].tag) 1455 self.assertEquals('{http://huhu}bump1', foo[0][0].tag) 1456 self.assertEquals('{http://huhu}bump2', foo[0][1].tag)14571459 ElementTree = self.etree.ElementTree 1460 f = BytesIO('<a><b></b>B2<c></c>C2</a>') 1461 doc = ElementTree(file=f) 1462 a = doc.getroot() 1463 del a[0] 1464 self.assertXML( 1465 _bytes('<a><c></c>C2</a>'), 1466 a)14671469 Element = self.etree.Element 1470 1471 a = Element('a') 1472 a.text = 'foo' 1473 a.tail = 'bar' 1474 a.set('hoi', 'dag') 1475 a.clear() 1476 self.assertEquals(None, a.text) 1477 self.assertEquals(None, a.tail) 1478 self.assertEquals(None, a.get('hoi')) 1479 self.assertEquals('a', a.tag)14801482 Element = self.etree.Element 1483 SubElement = self.etree.SubElement 1484 1485 a = Element('a') 1486 a.text = 'foo' 1487 a.tail = 'bar' 1488 a.set('hoi', 'dag') 1489 b = SubElement(a, 'b') 1490 c = SubElement(b, 'c') 1491 a.clear() 1492 self.assertEquals(None, a.text) 1493 self.assertEquals(None, a.tail) 1494 self.assertEquals(None, a.get('hoi')) 1495 self.assertEquals('a', a.tag) 1496 self.assertEquals(0, len(a)) 1497 self.assertXML(_bytes('<a></a>'), 1498 a) 1499 self.assertXML(_bytes('<b><c></c></b>'), 1500 b)15011503 ElementTree = self.etree.ElementTree 1504 f = BytesIO('<a><b></b>B2<c></c>C2</a>') 1505 doc = ElementTree(file=f) 1506 a = doc.getroot() 1507 a.clear() 1508 self.assertXML( 1509 _bytes('<a></a>'), 1510 a)15111513 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 = Element('d') 1520 a.insert(0, d) 1521 1522 self.assertEquals( 1523 d, 1524 a[0]) 1525 1526 self.assertXML( 1527 _bytes('<a><d></d><b></b><c></c></a>'), 1528 a) 1529 1530 e = Element('e') 1531 a.insert(2, e) 1532 self.assertEquals( 1533 e, 1534 a[2]) 1535 self.assertXML( 1536 _bytes('<a><d></d><b></b><e></e><c></c></a>'), 1537 a)15381540 Element = self.etree.Element 1541 SubElement = self.etree.SubElement 1542 1543 a = Element('a') 1544 b = SubElement(a, 'b') 1545 c = Element('c') 1546 1547 a.insert(2, c) 1548 self.assertEquals( 1549 c, 1550 a[1]) 1551 self.assertXML( 1552 _bytes('<a><b></b><c></c></a>'), 1553 a)15541556 Element = self.etree.Element 1557 SubElement = self.etree.SubElement 1558 1559 a = Element('a') 1560 b = SubElement(a, 'b') 1561 c = SubElement(a, 'c') 1562 1563 d = Element('d') 1564 a.insert(-1, d) 1565 self.assertEquals( 1566 d, 1567 a[-2]) 1568 self.assertXML( 1569 _bytes('<a><b></b><d></d><c></c></a>'), 1570 a)15711573 Element = self.etree.Element 1574 SubElement = self.etree.SubElement 1575 1576 a = Element('a') 1577 b = SubElement(a, 'b') 1578 1579 c = Element('c') 1580 c.tail = 'C2' 1581 1582 a.insert(0, c) 1583 self.assertXML( 1584 _bytes('<a><c></c>C2<b></b></a>'), 1585 a)15861588 Element = self.etree.Element 1589 SubElement = self.etree.SubElement 1590 1591 a = Element('a') 1592 b = SubElement(a, 'b') 1593 c = SubElement(a, 'c') 1594 1595 a.remove(b) 1596 self.assertEquals( 1597 c, 1598 a[0]) 1599 self.assertXML( 1600 _bytes('<a><c></c></a>'), 1601 a)16021604 Element = self.etree.Element 1605 SubElement = self.etree.SubElement 1606 1607 a = Element('{http://test}a') 1608 b = SubElement(a, '{http://test}b') 1609 c = SubElement(a, '{http://test}c') 1610 1611 a.remove(b) 1612 self.assertXML( 1613 _bytes('<ns0:a xmlns:ns0="http://test"><ns0:c></ns0:c></ns0:a>'), 1614 a) 1615 self.assertXML( 1616 _bytes('<ns0:b xmlns:ns0="http://test"></ns0:b>'), 1617 b)16181620 Element = self.etree.Element 1621 SubElement = self.etree.SubElement 1622 1623 a = Element('a') 1624 b = SubElement(a, 'b') 1625 c = SubElement(a, 'c') 1626 d = Element('d') 1627 self.assertRaises( 1628 ValueError, a.remove, d)16291631 Element = self.etree.Element 1632 SubElement = self.etree.SubElement 1633 1634 a = Element('a') 1635 b = SubElement(a, 'b') 1636 b.tail = 'b2' 1637 a.remove(b) 1638 self.assertXML( 1639 _bytes('<a></a>'), 1640 a) 1641 self.assertEquals('b2', b.tail)16421644 Element = self.etree.Element 1645 SubElement = self.etree.SubElement 1646 1647 a = Element('a') 1648 b = SubElement(a, 'b') 1649 c = SubElement(a, 'c') 1650 d = SubElement(b, 'd') 1651 e = SubElement(c, 'e') 1652 self.assertXML( 1653 _bytes('<a><b><d></d></b><c><e></e></c></a>'), 1654 a) 1655 self.assertEquals( 1656 [b, c], 1657 a.getchildren()) 1658 self.assertEquals( 1659 [d], 1660 b.getchildren()) 1661 self.assertEquals( 1662 [], 1663 d.getchildren())16641666 Element = self.etree.Element 1667 1668 a = Element('a') 1669 b = a.makeelement('c', {'hoi':'dag'}) 1670 self.assertXML( 1671 _bytes('<c hoi="dag"></c>'), 1672 b)1673 1674 required_versions_ET['test_iter'] = (1,3)1676 Element = self.etree.Element 1677 SubElement = self.etree.SubElement 1678 1679 a = Element('a') 1680 b = SubElement(a, 'b') 1681 c = SubElement(a, 'c') 1682 d = SubElement(b, 'd') 1683 e = SubElement(c, 'e') 1684 1685 self.assertEquals( 1686 [a, b, d, c, e], 1687 list(a.iter())) 1688 self.assertEquals( 1689 [d], 1690 list(d.iter()))16911693 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(b, 'd') 1700 e = SubElement(c, 'e') 1701 1702 self.assertEquals( 1703 [a, b, d, c, e], 1704 list(a.getiterator())) 1705 self.assertEquals( 1706 [d], 1707 list(d.getiterator()))17081710 Element = self.etree.Element 1711 SubElement = self.etree.SubElement 1712 1713 a = Element('a') 1714 b = SubElement(a, 'b') 1715 c = SubElement(a, 'c') 1716 d = SubElement(b, 'd') 1717 e = SubElement(c, 'e') 1718 1719 self.assertEquals( 1720 [], 1721 list(a.getiterator('none'))) 1722 self.assertEquals( 1723 [], 1724 list(e.getiterator('none'))) 1725 self.assertEquals( 1726 [e], 1727 list(e.getiterator()))17281730 Element = self.etree.Element 1731 SubElement = self.etree.SubElement 1732 1733 a = Element('a') 1734 b = SubElement(a, 'b') 1735 c = SubElement(a, 'c') 1736 d = SubElement(b, 'd') 1737 e = SubElement(c, 'e') 1738 1739 self.assertEquals( 1740 [a], 1741 list(a.getiterator('a'))) 1742 a2 = SubElement(e, 'a') 1743 self.assertEquals( 1744 [a, a2], 1745 list(a.getiterator('a'))) 1746 self.assertEquals( 1747 [a2], 1748 list(c.getiterator('a')))17491751 Element = self.etree.Element 1752 SubElement = self.etree.SubElement 1753 1754 a = Element('a') 1755 b = SubElement(a, 'b') 1756 c = SubElement(a, 'c') 1757 d = SubElement(b, 'd') 1758 e = SubElement(c, 'e') 1759 1760 self.assertEquals( 1761 [a, b, d, c, e], 1762 list(a.getiterator('*')))17631765 Element = self.etree.Element 1766 Comment = self.etree.Comment 1767 SubElement = self.etree.SubElement 1768 1769 a = Element('a') 1770 b = SubElement(a, 'b') 1771 comment_b = Comment("TEST-b") 1772 b.append(comment_b) 1773 1774 self.assertEquals( 1775 [comment_b], 1776 list(a.getiterator(Comment))) 1777 1778 comment_a = Comment("TEST-a") 1779 a.append(comment_a) 1780 1781 self.assertEquals( 1782 [comment_b, comment_a], 1783 list(a.getiterator(Comment))) 1784 1785 self.assertEquals( 1786 [comment_b], 1787 list(b.getiterator(Comment)))17881790 Element = self.etree.Element 1791 PI = self.etree.ProcessingInstruction 1792 SubElement = self.etree.SubElement 1793 1794 a = Element('a') 1795 b = SubElement(a, 'b') 1796 pi_b = PI("TEST-b") 1797 b.append(pi_b) 1798 1799 self.assertEquals( 1800 [pi_b], 1801 list(a.getiterator(PI))) 1802 1803 pi_a = PI("TEST-a") 1804 a.append(pi_a) 1805 1806 self.assertEquals( 1807 [pi_b, pi_a], 1808 list(a.getiterator(PI))) 1809 1810 self.assertEquals( 1811 [pi_b], 1812 list(b.getiterator(PI)))18131815 Element = self.etree.Element 1816 SubElement = self.etree.SubElement 1817 1818 a = Element('a') 1819 a.text = 'a' 1820 b = SubElement(a, 'b') 1821 b.text = 'b' 1822 b.tail = 'b1' 1823 c = SubElement(a, 'c') 1824 c.text = 'c' 1825 c.tail = 'c1' 1826 d = SubElement(b, 'd') 1827 c.text = 'd' 1828 c.tail = 'd1' 1829 e = SubElement(c, 'e') 1830 e.text = 'e' 1831 e.tail = 'e1' 1832 1833 self.assertEquals( 1834 [a, b, d, c, e], 1835 list(a.getiterator()))1836 #self.assertEquals( 1837 # [d], 1838 # list(d.getiterator())) 18391841 Element = self.etree.Element 1842 SubElement = self.etree.SubElement 1843 1844 a = Element('a') 1845 a.text = 'a' 1846 b = SubElement(a, 'b') 1847 b.text = 'b' 1848 b.tail = 'b1' 1849 c = SubElement(a, 'c') 1850 c.text = 'c' 1851 c.tail = 'c1' 1852 d = SubElement(b, 'd') 1853 c.text = 'd' 1854 c.tail = 'd1' 1855 e = SubElement(c, 'e') 1856 e.text = 'e' 1857 e.tail = 'e1' 1858 1859 self.assertEquals( 1860 [a], 1861 list(a.getiterator('a'))) 1862 a2 = SubElement(e, 'a') 1863 self.assertEquals( 1864 [a, a2], 1865 list(a.getiterator('a'))) 1866 self.assertEquals( 1867 [a2], 1868 list(e.getiterator('a')))18691871 Element = self.etree.Element 1872 SubElement = self.etree.SubElement 1873 1874 a = Element('a') 1875 b = SubElement(a, 'b') 1876 c = SubElement(a, 'c') 1877 d = SubElement(a, 'd') 1878 1879 self.assertEquals( 1880 [b, c], 1881 a[0:2]) 1882 self.assertEquals( 1883 [b, c, d], 1884 a[:]) 1885 self.assertEquals( 1886 [b, c, d], 1887 a[:10]) 1888 self.assertEquals( 1889 [b], 1890 a[0:1]) 1891 self.assertEquals( 1892 [], 1893 a[10:12])18941896 Element = self.etree.Element 1897 SubElement = self.etree.SubElement 1898 1899 a = Element('a') 1900 b = SubElement(a, 'b') 1901 c = SubElement(a, 'c') 1902 d = SubElement(a, 'd') 1903 1904 self.assertEquals( 1905 [d], 1906 a[-1:]) 1907 self.assertEquals( 1908 [c, d], 1909 a[-2:]) 1910 self.assertEquals( 1911 [c], 1912 a[-2:-1]) 1913 self.assertEquals( 1914 [b, c], 1915 a[-3:-1]) 1916 self.assertEquals( 1917 [b, c], 1918 a[-3:2])19191921 Element = self.etree.Element 1922 SubElement = self.etree.SubElement 1923 1924 a = Element('a') 1925 b = SubElement(a, 'b') 1926 c = SubElement(a, 'c') 1927 d = SubElement(a, 'd') 1928 e = SubElement(a, 'e') 1929 1930 self.assertEquals( 1931 [e,d,c,b], 1932 a[::-1]) 1933 self.assertEquals( 1934 [b,d], 1935 a[::2]) 1936 self.assertEquals( 1937 [e,c], 1938 a[::-2]) 1939 self.assertEquals( 1940 [d,c], 1941 a[-2:0:-1]) 1942 self.assertEquals( 1943 [e], 1944 a[:1:-2])19451947 ElementTree = self.etree.ElementTree 1948 1949 f = BytesIO('<a><b>B</b>B1<c>C</c>C1</a>') 1950 doc = ElementTree(file=f) 1951 a = doc.getroot() 1952 b = a[0] 1953 c = a[1] 1954 self.assertEquals( 1955 [b, c], 1956 a[:]) 1957 self.assertEquals( 1958 [b], 1959 a[0:1]) 1960 self.assertEquals( 1961 [c], 1962 a[1:])19631965 Element = self.etree.Element 1966 Comment = self.etree.Comment 1967 SubElement = self.etree.SubElement 1968 1969 a = Element('a') 1970 b = SubElement(a, 'b') 1971 foo = Comment('foo') 1972 a.append(foo) 1973 c = SubElement(a, 'c') 1974 self.assertEquals( 1975 [b, foo, c], 1976 a[:]) 1977 self.assertEquals( 1978 foo, 1979 a[1]) 1980 a[1] = new = Element('new') 1981 self.assertEquals( 1982 new, 1983 a[1]) 1984 self.assertXML( 1985 _bytes('<a><b></b><new></new><c></c></a>'), 1986 a)19871989 Element = self.etree.Element 1990 SubElement = self.etree.SubElement 1991 1992 a = Element('a') 1993 b = SubElement(a, 'b') 1994 c = SubElement(a, 'c') 1995 d = SubElement(a, 'd') 1996 e = SubElement(a, 'e') 1997 1998 del a[1:3] 1999 self.assertEquals( 2000 [b, e], 2001 list(a))20022004 Element = self.etree.Element 2005 SubElement = self.etree.SubElement 2006 2007 a = Element('a') 2008 b = SubElement(a, 'b') 2009 c = SubElement(a, 'c') 2010 d = SubElement(a, 'd') 2011 e = SubElement(a, 'e') 2012 2013 del a[1:-1] 2014 self.assertEquals( 2015 [b, e], 2016 list(a))20172019 Element = self.etree.Element 2020 SubElement = self.etree.SubElement 2021 2022 a = Element('a') 2023 b = SubElement(a, 'b') 2024 c = SubElement(a, 'c') 2025 d = SubElement(a, 'd') 2026 e = SubElement(a, 'e') 2027 2028 del a[-3:-1] 2029 self.assertEquals( 2030 [b, e], 2031 list(a))20322034 Element = self.etree.Element 2035 SubElement = self.etree.SubElement 2036 2037 a = Element('a') 2038 b = SubElement(a, 'b') 2039 c = SubElement(a, 'c') 2040 d = SubElement(a, 'd') 2041 e = SubElement(a, 'e') 2042 2043 del a[1::2] 2044 self.assertEquals( 2045 [b, d], 2046 list(a))20472049 Element = self.etree.Element 2050 SubElement = self.etree.SubElement 2051 2052 a = Element('a') 2053 b = SubElement(a, 'b') 2054 c = SubElement(a, 'c') 2055 d = SubElement(a, 'd') 2056 e = SubElement(a, 'e') 2057 2058 del a[::-1] 2059 self.assertEquals( 2060 [], 2061 list(a))20622064 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 e = SubElement(a, 'e') 2072 2073 del a[::-2] 2074 self.assertEquals( 2075 [b, d], 2076 list(a))20772079 ElementTree = self.etree.ElementTree 2080 f = BytesIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>') 2081 doc = ElementTree(file=f) 2082 a = doc.getroot() 2083 del a[1:3] 2084 self.assertXML( 2085 _bytes('<a><b></b>B2<e></e>E2</a>'), 2086 a)20872089 XML = self.etree.XML 2090 a = XML(_bytes('<a><b></b>B2<c></c>C2</a>')) 2091 b, c = a 2092 2093 del a[:] 2094 2095 self.assertEquals("B2", b.tail) 2096 self.assertEquals("C2", c.tail)20972099 # this could trigger a crash 2100 Element = self.etree.Element 2101 SubElement = self.etree.SubElement 2102 a = Element('a') 2103 b = SubElement(a, 'b') 2104 c = SubElement(b, 'c') 2105 del b # no more reference to b 2106 del a[:] 2107 self.assertEquals('c', c.tag)21082110 Element = self.etree.Element 2111 SubElement = self.etree.SubElement 2112 2113 a = Element('a') 2114 b = SubElement(a, 'b') 2115 c = SubElement(a, 'c') 2116 d = SubElement(a, 'd') 2117 2118 e = Element('e') 2119 f = Element('f') 2120 g = Element('g') 2121 2122 s = [e, f, g] 2123 a[1:2] = s 2124 self.assertEquals( 2125 [b, e, f, g, d], 2126 list(a))21272129 Element = self.etree.Element 2130 SubElement = self.etree.SubElement 2131 2132 a = Element('a') 2133 b = SubElement(a, 'b') 2134 c = SubElement(a, 'c') 2135 2136 e = Element('e') 2137 f = Element('f') 2138 g = Element('g') 2139 2140 s = [e, f, g] 2141 a[:] = s 2142 self.assertEquals( 2143 [e, f, g], 2144 list(a))21452147 Element = self.etree.Element 2148 SubElement = self.etree.SubElement 2149 2150 a = Element('a') 2151 2152 e = Element('e') 2153 f = Element('f') 2154 g = Element('g') 2155 2156 s = [e, f, g] 2157 a[:] = s 2158 self.assertEquals( 2159 [e, f, g], 2160 list(a))21612163 Element = self.etree.Element 2164 SubElement = self.etree.SubElement 2165 2166 a = Element('a') 2167 b = SubElement(a, 'b') 2168 c = SubElement(a, 'c') 2169 d = SubElement(a, 'd') 2170 2171 s = [b, c, d] 2172 a[:] = s 2173 self.assertEquals( 2174 [b, c, d], 2175 list(a))21762178 Element = self.etree.Element 2179 SubElement = self.etree.SubElement 2180 2181 a = Element('a') 2182 b = SubElement(a, 'b') 2183 c = SubElement(a, 'c') 2184 d = SubElement(a, 'd') 2185 2186 s = [d, c, b] 2187 a[:] = s 2188 self.assertEquals( 2189 [d, c, b], 2190 list(a))21912193 Element = self.etree.Element 2194 SubElement = self.etree.SubElement 2195 2196 a = Element('{ns}a') 2197 b = SubElement(a, '{ns}b', {'{ns1}a1': 'test'}) 2198 c = SubElement(a, '{ns}c', {'{ns2}a2': 'test'}) 2199 d = SubElement(a, '{ns}d', {'{ns3}a3': 'test'}) 2200 2201 s = [d, c, b] 2202 a[:] = s 2203 self.assertEquals( 2204 [d, c, b], 2205 list(a)) 2206 self.assertEquals( 2207 ['{ns}d', '{ns}c', '{ns}b'], 2208 [ child.tag for child in a ]) 2209 2210 self.assertEquals( 2211 [['{ns3}a3'], ['{ns2}a2'], ['{ns1}a1']], 2212 [ child.attrib.keys() for child in a ])22132215 Element = self.etree.Element 2216 SubElement = self.etree.SubElement 2217 2218 a = Element('{ns}a') 2219 b = SubElement(a, '{ns1}b', {'{ns}a1': 'test'}) 2220 c = SubElement(a, '{ns2}c', {'{ns}a2': 'test'}) 2221 d = SubElement(a, '{ns3}d', {'{ns}a3': 'test'}) 2222 2223 s = [d, c, b] 2224 a[:] = s 2225 self.assertEquals( 2226 [d, c, b], 2227 list(a)) 2228 self.assertEquals( 2229 ['{ns3}d', '{ns2}c', '{ns1}b'], 2230 [ child.tag for child in a ]) 2231 2232 self.assertEquals( 2233 [['{ns}a3'], ['{ns}a2'], ['{ns}a1']], 2234 [ child.attrib.keys() for child in a ])22352237 Element = self.etree.Element 2238 SubElement = self.etree.SubElement 2239 2240 a = Element('a') 2241 b = SubElement(a, 'b') 2242 c = SubElement(a, 'c') 2243 2244 e = Element('e') 2245 f = Element('f') 2246 g = Element('g') 2247 h = Element('h') 2248 2249 s = [e, f] 2250 a[99:] = s 2251 self.assertEquals( 2252 [a, b, e, f], 2253 list(a)) 2254 2255 s = [g, h] 2256 a[:0] = s 2257 self.assertEquals( 2258 [g, h, a, b, e, f], 2259 list(a))22602262 Element = self.etree.Element 2263 SubElement = self.etree.SubElement 2264 2265 a = Element('a') 2266 b = SubElement(a, 'b') 2267 c = SubElement(a, 'c') 2268 2269 e = Element('e') 2270 f = Element('f') 2271 2272 s = [e] 2273 a[0:1] = s 2274 self.assertEquals( 2275 [e, c], 2276 list(a)) 2277 2278 s = [f] 2279 a[1:2] = s 2280 self.assertEquals( 2281 [e, f], 2282 list(a))22832285 ElementTree = self.etree.ElementTree 2286 Element = self.etree.Element 2287 f = BytesIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>') 2288 doc = ElementTree(file=f) 2289 a = doc.getroot() 2290 x = Element('x') 2291 y = Element('y') 2292 z = Element('z') 2293 x.tail = 'X2' 2294 y.tail = 'Y2' 2295 z.tail = 'Z2' 2296 a[1:3] = [x, y, z] 2297 self.assertXML( 2298 _bytes('<a><b></b>B2<x></x>X2<y></y>Y2<z></z>Z2<e></e>E2</a>'), 2299 a)23002302 Element = self.etree.Element 2303 SubElement = self.etree.SubElement 2304 2305 a = Element('a') 2306 b = SubElement(a, 'b') 2307 c = SubElement(a, 'c') 2308 d = SubElement(a, 'd') 2309 2310 x = Element('x') 2311 y = Element('y') 2312 2313 a[1:-1] = [x, y] 2314 self.assertEquals( 2315 [b, x, y, d], 2316 list(a))23172319 Element = self.etree.Element 2320 SubElement = self.etree.SubElement 2321 2322 a = Element('a') 2323 b = SubElement(a, 'b') 2324 c = SubElement(a, 'c') 2325 d = SubElement(a, 'd') 2326 2327 x = Element('x') 2328 y = Element('y') 2329 2330 a[1:-2] = [x, y] 2331 self.assertEquals( 2332 [b, x, y, c, d], 2333 list(a))23342336 Element = self.etree.Element 2337 SubElement = self.etree.SubElement 2338 2339 a = Element('a') 2340 b = SubElement(a, 'b') 2341 c = SubElement(a, 'c') 2342 d = SubElement(a, 'd') 2343 2344 e = Element('e') 2345 f = Element('f') 2346 g = Element('g') 2347 2348 s = [e, f, g] 2349 a[3:] = s 2350 self.assertEquals( 2351 [b, c, d, e, f, g], 2352 list(a))23532355 Element = self.etree.Element 2356 2357 a = Element('a') 2358 2359 b = Element('b') 2360 c = Element('c') 2361 2362 a[:] = [b, c] 2363 self.assertEquals( 2364 [b, c], 2365 list(a))23662368 Element = self.etree.Element 2369 ElementTree = self.etree.ElementTree 2370 2371 a = Element('a') 2372 a.tail = 'A2' 2373 t = ElementTree(element=a) 2374 self.assertEquals('A2', 2375 a.tail)23762378 Element = self.etree.Element 2379 SubElement = self.etree.SubElement 2380 ElementTree = self.etree.ElementTree 2381 2382 a = Element('a') 2383 b = SubElement(a, 'b') 2384 c = SubElement(a, 'c') 2385 d = SubElement(b, 'd') 2386 e = SubElement(c, 'e') 2387 t = ElementTree(element=a) 2388 2389 self.assertEquals( 2390 [a, b, d, c, e], 2391 list(t.getiterator()))23922394 Element = self.etree.Element 2395 SubElement = self.etree.SubElement 2396 ElementTree = self.etree.ElementTree 2397 a = Element('a') 2398 b = SubElement(a, 'b') 2399 c = SubElement(a, 'c') 2400 d = SubElement(b, 'd') 2401 e = SubElement(c, 'e') 2402 t = ElementTree(element=a) 2403 2404 self.assertEquals( 2405 [a], 2406 list(t.getiterator('a'))) 2407 a2 = SubElement(e, 'a') 2408 self.assertEquals( 2409 [a, a2], 2410 list(t.getiterator('a')))24112413 ElementTree = self.etree.ElementTree 2414 ns = 'http://xml.infrae.com/1' 2415 f = BytesIO('<x:a xmlns:x="%s"><x:b></x:b></x:a>' % ns) 2416 t = ElementTree(file=f) 2417 a = t.getroot() 2418 self.assertEquals('{%s}a' % ns, 2419 a.tag) 2420 self.assertEquals('{%s}b' % ns, 2421 a[0].tag)24222424 ElementTree = self.etree.ElementTree 2425 ns = 'http://xml.infrae.com/1' 2426 ns2 = 'http://xml.infrae.com/2' 2427 f = BytesIO('<x:a xmlns:x="%s" xmlns:y="%s"><x:b></x:b><y:b></y:b></x:a>' % (ns, ns2)) 2428 t = ElementTree(file=f) 2429 a = t.getroot() 2430 self.assertEquals('{%s}a' % ns, 2431 a.tag) 2432 self.assertEquals('{%s}b' % ns, 2433 a[0].tag) 2434 self.assertEquals('{%s}b' % ns2, 2435 a[1].tag)24362438 Element = self.etree.Element 2439 SubElement = self.etree.SubElement 2440 ns = 'http://xml.infrae.com/1' 2441 ns2 = 'http://xml.infrae.com/2' 2442 a = Element('{%s}a' % ns) 2443 b = SubElement(a, '{%s}b' % ns2) 2444 c = SubElement(a, '{%s}c' % ns) 2445 self.assertEquals('{%s}a' % ns, 2446 a.tag) 2447 self.assertEquals('{%s}b' % ns2, 2448 b.tag) 2449 self.assertEquals('{%s}c' % ns, 2450 c.tag) 2451 self.assertEquals('{%s}a' % ns, 2452 a.tag) 2453 self.assertEquals('{%s}b' % ns2, 2454 b.tag) 2455 self.assertEquals('{%s}c' % ns, 2456 c.tag)24572459 Element = self.etree.Element 2460 SubElement = self.etree.SubElement 2461 ElementTree = self.etree.ElementTree 2462 2463 ns = 'http://xml.infrae.com/1' 2464 ns2 = 'http://xml.infrae.com/2' 2465 f = BytesIO('<a xmlns="%s" xmlns:x="%s"><x:b></x:b><b></b></a>' % (ns, ns2)) 2466 t = ElementTree(file=f) 2467 2468 a = t.getroot() 2469 self.assertEquals('{%s}a' % ns, 2470 a.tag) 2471 self.assertEquals('{%s}b' % ns2, 2472 a[0].tag) 2473 self.assertEquals('{%s}b' % ns, 2474 a[1].tag)24752477 Element = self.etree.Element 2478 ns = 'http://xml.infrae.com/1' 2479 ns2 = 'http://xml.infrae.com/2' 2480 a = Element('a') 2481 a.set('{%s}foo' % ns, 'Foo') 2482 a.set('{%s}bar' % ns2, 'Bar') 2483 self.assertEquals( 2484 'Foo', 2485 a.get('{%s}foo' % ns)) 2486 self.assertEquals( 2487 'Bar', 2488 a.get('{%s}bar' % ns2)) 2489 try: 2490 self.assertXML( 2491 _bytes('<a xmlns:ns0="%s" xmlns:ns1="%s" ns0:foo="Foo" ns1:bar="Bar"></a>' % (ns, ns2)), 2492 a) 2493 except AssertionError: 2494 self.assertXML( 2495 _bytes('<a xmlns:ns0="%s" xmlns:ns1="%s" ns1:foo="Foo" ns0:bar="Bar"></a>' % (ns2, ns)), 2496 a)24972499 Element = self.etree.Element 2500 one = self.etree.fromstring( 2501 _bytes('<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>')) 2502 baz = one[0][0] 2503 2504 two = Element('root') 2505 two.append(baz) 2506 # removing the originating document could cause a crash/error before 2507 # as namespace is not moved along with it 2508 del one, baz 2509 self.assertEquals('{http://a.b.c}baz', two[0].tag)25102512 tostring = self.etree.tostring 2513 root = self.etree.XML( 2514 _bytes('<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>')) 2515 baz = root[0][0] 2516 2517 nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"), 2518 tostring(baz)) 2519 self.assertEquals([_bytes("http://a.b.c")], nsdecl)25202522 tostring = self.etree.tostring 2523 root = self.etree.XML( 2524 _bytes('<foo><bar xmlns="http://a.b.c"><baz/></bar></foo>')) 2525 baz = root[0][0] 2526 2527 nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"), 2528 tostring(baz)) 2529 self.assertEquals([_bytes("http://a.b.c")], nsdecl)25302532 tostring = self.etree.tostring 2533 root = self.etree.XML( 2534 _bytes('<foo xmlns:ns="http://a.b.c"><bar><ns:baz/></bar></foo>')) 2535 baz = root[0][0] 2536 2537 nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"), 2538 tostring(baz)) 2539 2540 self.assertEquals([_bytes("http://a.b.c")], nsdecl)25412543 Element = self.etree.Element 2544 SubElement = self.etree.SubElement 2545 2546 root = Element("foo") 2547 bar = SubElement(root, "{http://a.b.c}bar") 2548 baz = SubElement(bar, "{http://a.b.c}baz") 2549 2550 nsdecl = re.findall(_bytes("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']"), 2551 self.etree.tostring(baz)) 2552 2553 self.assertEquals([_bytes("http://a.b.c")], nsdecl)25542556 Element = self.etree.Element 2557 2558 root = Element('element') 2559 2560 subelement = Element('subelement', 2561 {"{http://www.w3.org/XML/1998/namespace}id": "foo"}) 2562 self.assertEquals(1, len(subelement.attrib)) 2563 self.assertEquals( 2564 "foo", 2565 subelement.get("{http://www.w3.org/XML/1998/namespace}id")) 2566 2567 root.append(subelement) 2568 self.assertEquals(1, len(subelement.attrib)) 2569 self.assertEquals( 2570 list({"{http://www.w3.org/XML/1998/namespace}id" : "foo"}.items()), 2571 list(subelement.attrib.items())) 2572 self.assertEquals( 2573 "foo", 2574 subelement.get("{http://www.w3.org/XML/1998/namespace}id"))25752577 parse = self.etree.parse 2578 tostring = self.etree.tostring 2579 2580 ns_href = "http://a.b.c" 2581 one = parse( 2582 BytesIO('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href)) 2583 baz = one.getroot()[0][0] 2584 2585 parsed = parse(BytesIO( tostring(baz) )).getroot() 2586 self.assertEquals('{%s}baz' % ns_href, parsed.tag)25872589 fromstring = self.etree.fromstring 2590 tostring = self.etree.tostring 2591 2592 ns_href = "http://a.b.c" 2593 xml = _bytes('<root xmlns="%s" xmlns:x="%s"><el x:a="test" /></root>' % ( 2594 ns_href,ns_href)) 2595 root = fromstring(xml) 2596 self.assertEquals('test', root[0].get('{%s}a' % ns_href)) 2597 2598 xml2 = tostring(root) 2599 self.assertTrue(_bytes(':a=') in xml2, xml2) 2600 2601 root2 = fromstring(xml2) 2602 self.assertEquals('test', root[0].get('{%s}a' % ns_href))26032605 fromstring = self.etree.fromstring 2606 tostring = self.etree.tostring 2607 2608 ns_href = "http://a.b.c" 2609 xml = _bytes('<root xmlns="%s" xmlns:x="%s"><el x:a="test" /></root>' % ( 2610 ns_href,ns_href)) 2611 root = fromstring(xml) 2612 self.assertEquals('test', root[0].get('{%s}a' % ns_href)) 2613 2614 root[0].set('{%s}a' % ns_href, 'TEST') 2615 2616 xml2 = tostring(root) 2617 self.assertTrue(_bytes(':a=') in xml2, xml2) 2618 2619 root2 = fromstring(xml2) 2620 self.assertEquals('TEST', root[0].get('{%s}a' % ns_href))2621 2622 required_versions_ET['test_register_namespace'] = (1,3)2624 # ET 1.3+ 2625 Element = self.etree.Element 2626 tostring = self.etree.tostring 2627 prefix = 'TESTPREFIX' 2628 namespace = 'http://seriously.unknown/namespace/URI' 2629 2630 el = Element('{%s}test' % namespace) 2631 self.assertEquals(_bytes('<ns0:test xmlns:ns0="%s"></ns0:test>' % namespace), 2632 self._writeElement(el)) 2633 2634 self.etree.register_namespace(prefix, namespace) 2635 el = Element('{%s}test' % namespace) 2636 self.assertEquals(_bytes('<%s:test xmlns:%s="%s"></%s:test>' % ( 2637 prefix, prefix, namespace, prefix)), 2638 self._writeElement(el)) 2639 2640 self.assertRaises(ValueError, self.etree.register_namespace, 'ns25', namespace)26412643 tostring = self.etree.tostring 2644 Element = self.etree.Element 2645 SubElement = self.etree.SubElement 2646 2647 a = Element('a') 2648 b = SubElement(a, 'b') 2649 c = SubElement(a, 'c') 2650 2651 self.assertEquals(_bytes('<a><b></b><c></c></a>'), 2652 canonicalize(tostring(a)))26532655 tostring = self.etree.tostring 2656 Element = self.etree.Element 2657 SubElement = self.etree.SubElement 2658 2659 a = Element('a') 2660 b = SubElement(a, 'b') 2661 c = SubElement(a, 'c') 2662 d = SubElement(c, 'd') 2663 self.assertEquals(_bytes('<b></b>'), 2664 canonicalize(tostring(b))) 2665 self.assertEquals(_bytes('<c><d></d></c>'), 2666 canonicalize(tostring(c)))26672669 tostring = self.etree.tostring 2670 Element = self.etree.Element 2671 SubElement = self.etree.SubElement 2672 2673 a = Element('a') 2674 b = SubElement(a, 'b') 2675 c = SubElement(a, 'c') 2676 d = SubElement(c, 'd') 2677 b.tail = 'Foo' 2678 2679 self.assert_(tostring(b) == _bytes('<b/>Foo') or 2680 tostring(b) == _bytes('<b />Foo'))2681 2682 required_versions_ET['test_tostring_method_html'] = (1,3)2684 tostring = self.etree.tostring 2685 Element = self.etree.Element 2686 SubElement = self.etree.SubElement 2687 2688 html = Element('html') 2689 body = SubElement(html, 'body') 2690 p = SubElement(body, 'p') 2691 p.text = "html" 2692 SubElement(p, 'br').tail = "test" 2693 2694 self.assertEquals(_bytes('<html><body><p>html<br>test</p></body></html>'), 2695 tostring(html, method="html"))2696 2697 required_versions_ET['test_tostring_method_text'] = (1,3)2699 tostring = self.etree.tostring 2700 Element = self.etree.Element 2701 SubElement = self.etree.SubElement 2702 2703 a = Element('a') 2704 a.text = "A" 2705 a.tail = "tail" 2706 b = SubElement(a, 'b') 2707 b.text = "B" 2708 b.tail = "TAIL" 2709 c = SubElement(a, 'c') 2710 c.text = "C" 2711 2712 self.assertEquals(_bytes('ABTAILCtail'), 2713 tostring(a, method="text"))27142716 iterparse = self.etree.iterparse 2717 f = BytesIO('<a><b></b><c/></a>') 2718 2719 iterator = iterparse(f) 2720 self.assertEquals(None, 2721 iterator.root) 2722 events = list(iterator) 2723 root = iterator.root 2724 self.assertEquals( 2725 [('end', root[0]), ('end', root[1]), ('end', root)], 2726 events)27272729 iterparse = self.etree.iterparse 2730 iterator = iterparse(fileInTestDir("test.xml")) 2731 self.assertEquals(None, 2732 iterator.root) 2733 events = list(iterator) 2734 root = iterator.root 2735 self.assertEquals( 2736 [('end', root[0]), ('end', root)], 2737 events)27382740 iterparse = self.etree.iterparse 2741 f = BytesIO('<a><b></b><c/></a>') 2742 2743 iterator = iterparse(f, events=('start',)) 2744 events = list(iterator) 2745 root = iterator.root 2746 self.assertEquals( 2747 [('start', root), ('start', root[0]), ('start', root[1])], 2748 events)27492751 iterparse = self.etree.iterparse 2752 f = BytesIO('<a><b></b><c/></a>') 2753 2754 iterator = iterparse(f, events=('start','end')) 2755 events = list(iterator) 2756 root = iterator.root 2757 self.assertEquals( 2758 [('start', root), ('start', root[0]), ('end', root[0]), 2759 ('start', root[1]), ('end', root[1]), ('end', root)], 2760 events)27612763 iterparse = self.etree.iterparse 2764 f = BytesIO('<a><b></b><c/></a>') 2765 2766 iterator = iterparse(f) 2767 for event, elem in iterator: 2768 elem.clear() 2769 2770 root = iterator.root 2771 self.assertEquals(0, 2772 len(root))27732775 iterparse = self.etree.iterparse 2776 CHILD_COUNT = 12345 2777 f = BytesIO('<a>%s</a>' % ('<b>test</b>'*CHILD_COUNT)) 2778 2779 i = 0 2780 for key in iterparse(f): 2781 event, element = key 2782 i += 1 2783 self.assertEquals(i, CHILD_COUNT + 1)27842786 iterparse = self.etree.iterparse 2787 f = BytesIO('<a xmlns="http://ns1/"><b><c xmlns="http://ns2/"/></b></a>') 2788 2789 attr_name = '{http://testns/}bla' 2790 events = [] 2791 iterator = iterparse(f, events=('start','end','start-ns','end-ns')) 2792 for event, elem in iterator: 2793 events.append(event) 2794 if event == 'start': 2795 if elem.tag != '{http://ns1/}a': 2796 elem.set(attr_name, 'value') 2797 2798 self.assertEquals( 2799 ['start-ns', 'start', 'start', 'start-ns', 'start', 2800 'end', 'end-ns', 'end', 'end', 'end-ns'], 2801 events) 2802 2803 root = iterator.root 2804 self.assertEquals( 2805 None, 2806 root.get(attr_name)) 2807 self.assertEquals( 2808 'value', 2809 root[0].get(attr_name))28102812 iterparse = self.etree.iterparse 2813 f = BytesIO('<a><b><d/></b><c/></a>') 2814 2815 counts = [] 2816 for event, elem in iterparse(f): 2817 counts.append(len(list(elem.getiterator()))) 2818 self.assertEquals( 2819 [1,2,1,4], 2820 counts)28212823 iterparse = self.etree.iterparse 2824 f = BytesIO('<a><b><d/></b><c/></a>') 2825 2826 for event, node in etree.iterparse(f): pass 2827 2828 root = etree.Element('new_root', {}) 2829 root[:] = node[:] 2830 2831 self.assertEquals( 2832 ['b', 'c'], 2833 [ el.tag for el in root ])28342836 tostring = self.etree.tostring 2837 f = BytesIO('<root><![CDATA[test]]></root>') 2838 context = self.etree.iterparse(f) 2839 content = [ el.text for event,el in context ] 2840 2841 self.assertEquals(['test'], content) 2842 self.assertEquals(_bytes('<root>test</root>'), 2843 tostring(context.root))28442846 parse = self.etree.parse 2847 # from file 2848 tree = parse(fileInTestDir('test.xml')) 2849 self.assertXML( 2850 _bytes('<a><b></b></a>'), 2851 tree.getroot())2852 2856 2860 2861 required_versions_ET['test_parse_error'] = (1,3)2863 # ET < 1.3 raises ExpatError 2864 parse = self.etree.parse 2865 f = BytesIO('<a><b></c></b></a>') 2866 self.assertRaises(SyntaxError, parse, f) 2867 f.close()2868 2869 required_versions_ET['test_parse_error_from_file'] = (1,3)2871 parse = self.etree.parse 2872 # from file 2873 f = open(fileInTestDir('test_broken.xml'), 'rb') 2874 self.assertRaises(SyntaxError, parse, f) 2875 f.close()28762878 parse = self.etree.parse 2879 # from file object 2880 f = open(fileInTestDir('test.xml'), 'rb') 2881 tree = parse(f) 2882 f.close() 2883 self.assertXML( 2884 _bytes('<a><b></b></a>'), 2885 tree.getroot())28862888 parse = self.etree.parse 2889 f = BytesIO('<a><b></b></a>') 2890 tree = parse(f) 2891 f.close() 2892 self.assertXML( 2893 _bytes('<a><b></b></a>'), 2894 tree.getroot() 2895 )28962898 tostring = self.etree.tostring 2899 root = self.etree.XML(_bytes('<root><![CDATA[test]]></root>')) 2900 2901 self.assertEquals('test', root.text) 2902 self.assertEquals(_bytes('<root>test</root>'), 2903 tostring(root))29042906 # this can fail in libxml2 <= 2.6.22 2907 parse = self.etree.parse 2908 tree = parse(BytesIO('<?xml version="1.0" encoding="ascii"?><html/>')) 2909 self.assertXML(_bytes('<html></html>'), 2910 tree.getroot())29112913 Element = self.etree.Element 2914 2915 a = Element('a') 2916 a.text = _str('Søk på nettet') 2917 self.assertXML( 2918 _str('<a>Søk på nettet</a>').encode('UTF-8'), 2919 a, 'utf-8')29202922 ElementTree = self.etree.ElementTree 2923 Element = self.etree.Element 2924 2925 a = Element('a') 2926 a.text = _str('Søk på nettet') 2927 2928 f = BytesIO() 2929 tree = ElementTree(element=a) 2930 tree.write(f, encoding='utf-8') 2931 self.assertEquals(_str('<a>Søk på nettet</a>').encode('UTF-8'), 2932 f.getvalue().replace(_bytes('\n'),_bytes('')))29332935 parse = self.etree.parse 2936 # from file 2937 tree = parse(fileInTestDir('test-string.xml')) 2938 self.assertXML( 2939 _str('<a>Søk på nettet</a>').encode('UTF-8'), 2940 tree.getroot(), 'UTF-8')29412943 parse = self.etree.parse 2944 # from file object 2945 f = open(fileInTestDir('test-string.xml'), 'rb') 2946 tree = parse(f) 2947 f.close() 2948 self.assertXML( 2949 _str('<a>Søk på nettet</a>').encode('UTF-8'), 2950 tree.getroot(), 'UTF-8')29512953 ElementTree = self.etree.ElementTree 2954 Element = self.etree.Element 2955 2956 a = Element('a') 2957 a.text = _str('Søk på nettet') 2958 2959 f = BytesIO() 2960 tree = ElementTree(element=a) 2961 tree.write(f, encoding='iso-8859-1') 2962 result = f.getvalue() 2963 declaration = _bytes("<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>") 2964 self.assertEncodingDeclaration(result, _bytes('iso-8859-1')) 2965 result = result.split(_bytes('?>'), 1)[-1].replace(_bytes('\n'),_bytes('')) 2966 self.assertEquals(_str('<a>Søk på nettet</a>').encode('iso-8859-1'), 2967 result)2968 2969 required_versions_ET['test_parse_encoding_8bit_explicit'] = (1,3)2971 XMLParser = self.etree.XMLParser 2972 2973 text = _str('Søk på nettet') 2974 xml_latin1 = (_str('<a>%s</a>') % text).encode('iso-8859-1') 2975 2976 self.assertRaises(self.etree.ParseError, 2977 self.etree.parse, 2978 BytesIO(xml_latin1)) 2979 2980 tree = self.etree.parse(BytesIO(xml_latin1), 2981 XMLParser(encoding="iso-8859-1")) 2982 a = tree.getroot() 2983 self.assertEquals(a.text, text)2984 2985 required_versions_ET['test_parse_encoding_8bit_override'] = (1,3)2987 XMLParser = self.etree.XMLParser 2988 2989 text = _str('Søk på nettet') 2990 wrong_declaration = _str("<?xml version='1.0' encoding='UTF-8'?>") 2991 xml_latin1 = (_str('%s<a>%s</a>') % (wrong_declaration, text) 2992 ).encode('iso-8859-1') 2993 2994 self.assertRaises(self.etree.ParseError, 2995 self.etree.parse, 2996 BytesIO(xml_latin1)) 2997 2998 tree = self.etree.parse(BytesIO(xml_latin1), 2999 XMLParser(encoding="iso-8859-1")) 3000 a = tree.getroot() 3001 self.assertEquals(a.text, text)30023004 # raise error on wrong encoding declaration in unicode strings 3005 XML = self.etree.XML 3006 test_utf = (_str('<?xml version="1.0" encoding="iso-8859-1"?>') + 3007 _str('<a>Søk på nettet</a>')) 3008 self.assertRaises(SyntaxError, XML, test_utf)30093011 ElementTree = self.etree.ElementTree 3012 Element = self.etree.Element 3013 3014 a = Element('a') 3015 a.text = _str('Søk på nettet') 3016 3017 f = BytesIO() 3018 tree = ElementTree(element=a) 3019 tree.write(f) 3020 data = f.getvalue().replace(_bytes('\n'),_bytes('')) 3021 self.assertEquals( 3022 _str('<a>Søk på nettet</a>').encode('ASCII', 'xmlcharrefreplace'), 3023 data)30243026 Element = self.etree.Element 3027 tostring = self.etree.tostring 3028 3029 a = Element('a') 3030 a.text = _str('Søk på nettet') 3031 self.assertEquals(_str('<a>Søk på nettet</a>').encode('UTF-8'), 3032 tostring(a, encoding='utf-8'))30333035 Element = self.etree.Element 3036 tostring = self.etree.tostring 3037 3038 a = Element('a') 3039 a.text = _str('Søk på nettet') 3040 self.assertRaises(LookupError, tostring, a, 3041 encoding='Invalid Encoding')30423044 Element = self.etree.Element 3045 SubElement = self.etree.SubElement 3046 tostring = self.etree.tostring 3047 3048 a = Element('a') 3049 b = SubElement(a, 'b') 3050 b.text = _str('Søk på nettet') 3051 self.assertEquals(_str('<b>Søk på nettet</b>').encode('UTF-8'), 3052 tostring(b, encoding='utf-8'))30533055 Element = self.etree.Element 3056 SubElement = self.etree.SubElement 3057 tostring = self.etree.tostring 3058 3059 a = Element('a') 3060 b = SubElement(a, 'b') 3061 b.text = _str('Søk på nettet') 3062 b.tail = _str('Søk') 3063 self.assertEquals(_str('<b>Søk på nettet</b>Søk').encode('UTF-8'), 3064 tostring(b, encoding='utf-8'))30653067 Element = self.etree.Element 3068 SubElement = self.etree.SubElement 3069 tostring = self.etree.tostring 3070 3071 a = Element('a') 3072 a.text = _str('Søk på nettet') 3073 3074 expected = _bytes('<a>Søk på nettet</a>') 3075 self.assertEquals( 3076 expected, 3077 tostring(a))30783080 Element = self.etree.Element 3081 SubElement = self.etree.SubElement 3082 tostring = self.etree.tostring 3083 3084 a = Element('a') 3085 b = SubElement(a, 'b') 3086 b.text = _str('Søk på nettet') 3087 3088 expected = _bytes('<b>Søk på nettet</b>') 3089 self.assertEquals( 3090 expected, 3091 tostring(b))30923094 utext = _str('Søk på nettet') 3095 uxml = _str('<p>%s</p>') % utext 3096 prologue = _bytes('<?xml version="1.0" encoding="iso-8859-1" ?>') 3097 isoxml = prologue + uxml.encode('iso-8859-1') 3098 tree = self.etree.XML(isoxml) 3099 self.assertEquals(utext, tree.text)31003102 utext = _str('Søk på nettet') 3103 uxml = (_str('<?xml version="1.0" encoding="UTF-8"?>') + 3104 _str('<p>%s</p>') % utext) 3105 bom = _bytes('\\xEF\\xBB\\xBF').decode("unicode_escape").encode("latin1") 3106 xml = bom + uxml.encode("utf-8") 3107 tree = etree.XML(xml) 3108 self.assertEquals(utext, tree.text)31093111 utext = _str('Søk på nettet') 3112 uxml = _str('<p>%s</p>') % utext 3113 prologue = _bytes('<?xml version="1.0" encoding="iso-8859-1" ?>') 3114 isoxml = prologue + uxml.encode('iso-8859-1') 3115 el = self.etree.parse(BytesIO(isoxml)).getroot() 3116 self.assertEquals(utext, el.text)31173119 Element = self.etree.Element 3120 ElementTree = self.etree.ElementTree 3121 3122 a = Element('a') 3123 a.text = "Foo" 3124 atree = ElementTree(a) 3125 3126 btree = copy.deepcopy(atree) 3127 self.assertEqual("Foo", atree.getroot().text) 3128 self.assertEqual("Foo", btree.getroot().text) 3129 self.assertFalse(btree is atree) 3130 self.assertFalse(btree.getroot() is atree.getroot())31313133 Element = self.etree.Element 3134 3135 a = Element('a') 3136 a.text = 'Foo' 3137 3138 b = copy.deepcopy(a) 3139 self.assertEquals('Foo', b.text) 3140 3141 b.text = 'Bar' 3142 self.assertEquals('Bar', b.text) 3143 self.assertEquals('Foo', a.text) 3144 3145 del a 3146 self.assertEquals('Bar', b.text)31473149 Element = self.etree.Element 3150 3151 a = Element('a') 3152 a.tail = 'Foo' 3153 3154 b = copy.deepcopy(a) 3155 self.assertEquals('Foo', b.tail) 3156 3157 b.tail = 'Bar' 3158 self.assertEquals('Bar', b.tail) 3159 self.assertEquals('Foo', a.tail) 3160 3161 del a 3162 self.assertEquals('Bar', b.tail)31633165 Element = self.etree.Element 3166 SubElement = self.etree.SubElement 3167 3168 root = Element('root') 3169 a = SubElement(root, 'a') 3170 a.text = 'FooText' 3171 a.tail = 'FooTail' 3172 3173 b = copy.deepcopy(a) 3174 self.assertEquals('FooText', b.text) 3175 self.assertEquals('FooTail', b.tail) 3176 3177 b.text = 'BarText' 3178 b.tail = 'BarTail' 3179 self.assertEquals('BarTail', b.tail) 3180 self.assertEquals('FooTail', a.tail) 3181 self.assertEquals('BarText', b.text) 3182 self.assertEquals('FooText', a.text) 3183 3184 del a 3185 self.assertEquals('BarTail', b.tail) 3186 self.assertEquals('BarText', b.text)31873189 root = self.etree.XML(_bytes('''<doc xmlns="dns" xmlns:t="tns"> 3190 <parent><node t:foo="bar" /></parent> 3191 </doc>''')) 3192 self.assertEquals( 3193 root[0][0].get('{tns}foo'), 3194 copy.deepcopy(root[0])[0].get('{tns}foo') ) 3195 self.assertEquals( 3196 root[0][0].get('{tns}foo'), 3197 copy.deepcopy(root[0][0]).get('{tns}foo') )31983200 # previously caused a crash 3201 Element = self.etree.Element 3202 tostring = self.etree.tostring 3203 3204 a = Element('a') 3205 b = copy.deepcopy(a) 3206 a.append( Element('C') ) 3207 b.append( Element('X') ) 3208 3209 self.assertEquals(_bytes('<a><C/></a>'), 3210 tostring(a).replace(_bytes(' '), _bytes(''))) 3211 self.assertEquals(_bytes('<a><X/></a>'), 3212 tostring(b).replace(_bytes(' '), _bytes('')))32133215 # previously caused a crash 3216 # not supported by ET < 1.3! 3217 Comment = self.etree.Comment 3218 3219 a = Comment("ONE") 3220 b = copy.deepcopy(a) 3221 b.text = "ANOTHER" 3222 3223 self.assertEquals('ONE', a.text) 3224 self.assertEquals('ANOTHER', b.text)32253227 Element = self.etree.Element 3228 3229 a = Element('a') 3230 a.text = 'Foo' 3231 3232 b = copy.copy(a) 3233 self.assertEquals('Foo', b.text) 3234 3235 b.text = 'Bar' 3236 self.assertEquals('Bar', b.text) 3237 self.assertEquals('Foo', a.text)3238 # XXX ElementTree will share nodes, but lxml.etree won't.. 32393241 Element = self.etree.Element 3242 ElementTree = self.etree.ElementTree 3243 3244 a = Element('a') 3245 a.text = 'Foo' 3246 atree = ElementTree(a) 3247 3248 btree = copy.copy(atree) 3249 self.assertFalse(btree is atree) 3250 self.assert_(btree.getroot() is atree.getroot()) 3251 self.assertEquals('Foo', atree.getroot().text)32523254 # deprecated as of ET 1.3/lxml 2.0 3255 etree = self.etree 3256 e = etree.Element('foo') 3257 self.assertEquals(False, bool(e)) 3258 etree.SubElement(e, 'bar') 3259 self.assertEquals(True, bool(e)) 3260 e = etree.Element('foo') 3261 e.text = 'hey' 3262 self.assertEquals(False, bool(e)) 3263 e = etree.Element('foo') 3264 e.tail = 'bar' 3265 self.assertEquals(False, bool(e)) 3266 e = etree.Element('foo') 3267 e.set('bar', 'Bar') 3268 self.assertEquals(False, bool(e))32693271 etree = self.etree 3272 3273 a = etree.Element('a') 3274 b = etree.SubElement(a, 'b') 3275 3276 t = etree.ElementTree(a) 3277 self.assertEquals(self._rootstring(t), _bytes('<a><b/></a>')) 3278 3279 t1 = etree.ElementTree(a) 3280 self.assertEquals(self._rootstring(t1), _bytes('<a><b/></a>')) 3281 self.assertEquals(self._rootstring(t), _bytes('<a><b/></a>')) 3282 3283 t2 = etree.ElementTree(b) 3284 self.assertEquals(self._rootstring(t2), _bytes('<b/>')) 3285 self.assertEquals(self._rootstring(t1), _bytes('<a><b/></a>')) 3286 self.assertEquals(self._rootstring(t), _bytes('<a><b/></a>'))32873289 etree = self.etree 3290 qname = etree.QName('myns', 'a') 3291 a1 = etree.Element(qname) 3292 a2 = etree.SubElement(a1, qname) 3293 self.assertEquals(a1.tag, "{myns}a") 3294 self.assertEquals(a2.tag, "{myns}a")32953297 etree = self.etree 3298 qname1 = etree.QName('myns', 'a') 3299 qname2 = etree.QName('myns', 'a') 3300 self.assertEquals(qname1, "{myns}a") 3301 self.assertEquals("{myns}a", qname2) 3302 self.assertEquals(qname1, qname1) 3303 self.assertEquals(qname1, qname2)33043306 etree = self.etree 3307 qname = etree.QName('myns', 'a') 3308 3309 a = etree.Element(qname) 3310 a.set(qname, "value") 3311 3312 self.assertEquals(a.get(qname), "value") 3313 self.assertEquals(a.get("{myns}a"), "value")33143316 etree = self.etree 3317 qname = etree.QName('myns', 'a') 3318 3319 a = etree.Element(qname) 3320 a.attrib[qname] = "value" 3321 3322 self.assertEquals(a.attrib[qname], "value") 3323 self.assertEquals(a.attrib.get(qname), "value") 3324 3325 self.assertEquals(a.attrib["{myns}a"], "value") 3326 self.assertEquals(a.attrib.get("{myns}a"), "value")33273329 etree = self.etree 3330 qname = etree.QName('http://myns', 'a') 3331 a = etree.Element(qname) 3332 a.set(qname, qname) 3333 3334 self.assertXML( 3335 _bytes('<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>'), 3336 a)33373339 etree = self.etree 3340 qname = etree.QName('http://myns', 'a') 3341 a = etree.Element('a') 3342 a.set('a', qname) 3343 3344 self.assertXML( 3345 _bytes('<a xmlns:ns0="http://myns" a="ns0:a"></a>'), 3346 a)33473349 etree = self.etree 3350 qname = etree.QName('http://myns', 'a') 3351 a = etree.Element(qname) 3352 a.attrib[qname] = qname 3353 3354 self.assertXML( 3355 _bytes('<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>'), 3356 a)33573359 etree = self.etree 3360 parser = etree.XMLParser() 3361 if hasattr(parser, "version"): 3362 # ElementTree 1.3+, cET 3363 self.assert_(re.match("[^ ]+ [0-9.]+", parser.version))3364 3365 # feed parser interface 33663368 parser = self.etree.XMLParser() 3369 3370 parser.feed(_bytes('<?xml version=')) 3371 parser.feed(_bytes('"1.0"?><ro')) 3372 parser.feed(_bytes('ot><')) 3373 parser.feed(_bytes('a test="works"/')) 3374 parser.feed(_bytes('></root')) 3375 parser.feed(_bytes('>')) 3376 3377 root = parser.close() 3378 3379 self.assertEquals(root.tag, "root") 3380 self.assertEquals(root[0].tag, "a") 3381 self.assertEquals(root[0].get("test"), "works")33823384 parser = self.etree.XMLParser() 3385 3386 parser.feed(_str('<ro')) 3387 parser.feed(_str('ot><')) 3388 parser.feed(_str('a test="works"/')) 3389 parser.feed(_str('></root')) 3390 parser.feed(_str('>')) 3391 3392 root = parser.close() 3393 3394 self.assertEquals(root.tag, "root") 3395 self.assertEquals(root[0].tag, "a") 3396 self.assertEquals(root[0].get("test"), "works")3397 3398 required_versions_ET['test_feed_parser_error_close_empty'] = (1,3)3400 ParseError = self.etree.ParseError 3401 parser = self.etree.XMLParser() 3402 self.assertRaises(ParseError, parser.close)3403 3404 required_versions_ET['test_feed_parser_error_close_incomplete'] = (1,3)3406 ParseError = self.etree.ParseError 3407 parser = self.etree.XMLParser() 3408 3409 parser.feed('<?xml version=') 3410 parser.feed('"1.0"?><ro') 3411 3412 self.assertRaises(ParseError, parser.close)3413 3414 required_versions_ET['test_feed_parser_error_broken'] = (1,3)3416 ParseError = self.etree.ParseError 3417 parser = self.etree.XMLParser() 3418 3419 parser.feed('<?xml version=') 3420 parser.feed('"1.0"?><ro') 3421 try: 3422 parser.feed('<><><><><><><') 3423 except ParseError: 3424 # can raise, but not required before close() 3425 pass 3426 3427 self.assertRaises(ParseError, parser.close)3428 3429 required_versions_ET['test_feed_parser_error_position'] = (1,3)3431 ParseError = self.etree.ParseError 3432 parser = self.etree.XMLParser() 3433 try: 3434 parser.close() 3435 except ParseError: 3436 e = sys.exc_info()[1] 3437 self.assertNotEquals(None, e.code) 3438 self.assertNotEquals(0, e.code) 3439 self.assert_(isinstance(e.position, tuple)) 3440 self.assert_(e.position >= (0, 0))3441 3442 # parser target interface 3443 3444 required_versions_ET['test_parser_target_property'] = (1,3) 3448 3449 target = Target() 3450 parser = self.etree.XMLParser(target=target) 3451 3452 self.assertEquals(target, parser.target) 34533455 assertEquals = self.assertEquals 3456 assertFalse = self.assertFalse 3457 3458 events = [] 3459 class Target(object): 3460 def start(self, tag, attrib): 3461 events.append("start") 3462 assertFalse(attrib) 3463 assertEquals("TAG", tag)3464 def end(self, tag): 3465 events.append("end") 3466 assertEquals("TAG", tag) 3467 def close(self): 3468 return "DONE" 3469 3470 parser = self.etree.XMLParser(target=Target()) 3471 3472 parser.feed("<TAG/>") 3473 done = parser.close() 3474 3475 self.assertEquals("DONE", done) 3476 self.assertEquals(["start", "end"], events) 34773479 assertEquals = self.assertEquals 3480 assertFalse = self.assertFalse 3481 Element = self.etree.Element 3482 3483 events = [] 3484 class Target(object): 3485 def start(self, tag, attrib): 3486 events.append("start") 3487 assertFalse(attrib) 3488 assertEquals("TAG", tag)3489 def end(self, tag): 3490 events.append("end") 3491 assertEquals("TAG", tag) 3492 def close(self): 3493 return Element("DONE") 3494 3495 parser = self.etree.XMLParser(target=Target()) 3496 tree = self.etree.ElementTree() 3497 tree.parse(BytesIO("<TAG/>"), parser=parser) 3498 3499 self.assertEquals("DONE", tree.getroot().tag) 3500 self.assertEquals(["start", "end"], events) 35013503 assertEquals = self.assertEquals 3504 3505 events = [] 3506 class Target(object): 3507 def start(self, tag, attrib): 3508 events.append("start-" + tag) 3509 for name, value in attrib.items(): 3510 assertEquals(tag + name, value)3511 def end(self, tag): 3512 events.append("end-" + tag) 3513 def close(self): 3514 return "DONE" 3515 3516 parser = self.etree.XMLParser(target=Target()) 3517 3518 parser.feed('<root a="roota" b="rootb"><sub c="subc"/></root>') 3519 done = parser.close() 3520 3521 self.assertEquals("DONE", done) 3522 self.assertEquals(["start-root", "start-sub", "end-sub", "end-root"], 3523 events) 35243526 events = [] 3527 class Target(object): 3528 def start(self, tag, attrib): 3529 events.append("start-" + tag)3530 def end(self, tag): 3531 events.append("end-" + tag) 3532 def data(self, data): 3533 events.append("data-" + data) 3534 def close(self): 3535 return "DONE" 3536 3537 parser = self.etree.XMLParser(target=Target()) 3538 3539 parser.feed('<root>A<sub/>B</root>') 3540 done = parser.close() 3541 3542 self.assertEquals("DONE", done) 3543 self.assertEquals(["start-root", "data-A", "start-sub", 3544 "end-sub", "data-B", "end-root"], 3545 events) 3546 3552 def _flush_data(self): 3553 if self._data: 3554 events.append("data-" + ''.join(self._data)) 3555 del self._data[:] 3556 def start(self, tag, attrib): 3557 self._flush_data() 3558 events.append("start-" + tag) 3559 def end(self, tag): 3560 self._flush_data() 3561 events.append("end-" + tag) 3562 def data(self, data): 3563 self._data.append(data) 3564 def close(self): 3565 self._flush_data() 3566 return "DONE" 3567 3568 parser = self.etree.XMLParser(target=Target()) 3569 3570 dtd = ''' 3571 <!DOCTYPE root [ 3572 <!ELEMENT root (sub*)> 3573 <!ELEMENT sub (#PCDATA)> 3574 <!ENTITY ent "an entity"> 3575 ]> 3576 ''' 3577 parser.feed(dtd+'<root><sub/><sub>this is &ent;</sub><sub/></root>') 3578 done = parser.close() 3579 3580 self.assertEquals("DONE", done) 3581 self.assertEquals(["start-root", "start-sub", "end-sub", "start-sub", 3582 "data-this is an entity", 3583 "end-sub", "start-sub", "end-sub", "end-root"], 3584 events) 3585 3586 required_versions_ET['test_parser_target_entity_unknown'] = (1,3) 3592 def _flush_data(self): 3593 if self._data: 3594 events.append("data-" + ''.join(self._data)) 3595 del self._data[:] 3596 def start(self, tag, attrib): 3597 self._flush_data() 3598 events.append("start-" + tag) 3599 def end(self, tag): 3600 self._flush_data() 3601 events.append("end-" + tag) 3602 def data(self, data): 3603 self._data.append(data) 3604 def close(self): 3605 self._flush_data() 3606 return "DONE" 3607 3608 parser = self.etree.XMLParser(target=Target()) 3609 3610 def feed(): 3611 parser.feed('<root><sub/><sub>some &ent;</sub><sub/></root>') 3612 parser.close() 3613 3614 self.assertRaises(self.etree.ParseError, feed) 36153617 builder = self.etree.TreeBuilder() 3618 el = builder.start("root", {'a':'A', 'b':'B'}) 3619 self.assertEquals("root", el.tag) 3620 self.assertEquals({'a':'A', 'b':'B'}, el.attrib) 3621 builder.data("ROOTTEXT") 3622 el = builder.start("child", {'x':'X', 'y':'Y'}) 3623 self.assertEquals("child", el.tag) 3624 self.assertEquals({'x':'X', 'y':'Y'}, el.attrib) 3625 builder.data("CHILDTEXT") 3626 el = builder.end("child") 3627 self.assertEquals("child", el.tag) 3628 self.assertEquals({'x':'X', 'y':'Y'}, el.attrib) 3629 self.assertEquals("CHILDTEXT", el.text) 3630 self.assertEquals(None, el.tail) 3631 builder.data("CHILDTAIL") 3632 root = builder.end("root") 3633 3634 self.assertEquals("root", root.tag) 3635 self.assertEquals("ROOTTEXT", root.text) 3636 self.assertEquals("CHILDTEXT", root[0].text) 3637 self.assertEquals("CHILDTAIL", root[0].tail)36383640 parser = self.etree.XMLParser(target=self.etree.TreeBuilder()) 3641 parser.feed('<root>ROOTTEXT<child>CHILDTEXT</child>CHILDTAIL</root>') 3642 root = parser.close() 3643 3644 self.assertEquals("root", root.tag) 3645 self.assertEquals("ROOTTEXT", root.text) 3646 self.assertEquals("CHILDTEXT", root[0].text) 3647 self.assertEquals("CHILDTAIL", root[0].tail)3648 3649 # helper methods 36503652 """Write out element for comparison. 3653 """ 3654 data = self.etree.tostring(element, encoding=encoding) 3655 if encoding != 'us-ascii': 3656 data = data.decode(encoding) 3657 return canonicalize(data)36583660 """Write out element for comparison, using real file. 3661 """ 3662 ElementTree = self.etree.ElementTree 3663 handle, filename = tempfile.mkstemp() 3664 try: 3665 f = open(filename, 'wb') 3666 tree = ElementTree(element=element) 3667 tree.write(f, encoding=encoding) 3668 f.close() 3669 f = open(filename, 'rb') 3670 data = f.read() 3671 f.close() 3672 finally: 3673 os.close(handle) 3674 os.remove(filename) 3675 if encoding != 'us-ascii': 3676 data = data.decode(encoding) 3677 return canonicalize(data)36783680 """Writes element out and checks whether it is expected. 3681 3682 Does this two ways; once using BytesIO, once using a real file. 3683 """ 3684 self.assertEquals(expected, self._writeElement(element, encoding)) 3685 self.assertEquals(expected, self._writeElementFile(element, encoding))36863688 "Checks if the result XML byte string specifies the encoding." 3689 enc_re = r"<\?xml[^>]+ encoding=[\"']([^\"']+)[\"']" 3690 if isinstance(result, str): 3691 has_encoding = re.compile(enc_re).match 3692 else: 3693 has_encoding = re.compile(_bytes(enc_re)).match 3694 self.assert_(has_encoding(result)) 3695 result_encoding = has_encoding(result).group(1) 3696 self.assertEquals(result_encoding.upper(), encoding.upper())36973699 return self.etree.tostring(tree.getroot()).replace( 3700 _bytes(' '), _bytes('')).replace(_bytes('\n'), _bytes(''))3701 37043706 self.assert_(hasattr(element, 'tag')) 3707 self.assert_(hasattr(element, 'attrib')) 3708 self.assert_(hasattr(element, 'text')) 3709 self.assert_(hasattr(element, 'tail')) 3710 self._check_string(element.tag) 3711 self._check_mapping(element.attrib) 3712 if element.text != None: 3713 self._check_string(element.text) 3714 if element.tail != None: 3715 self._check_string(element.tail)37163718 len(string) 3719 for char in string: 3720 self.assertEquals(1, len(char)) 3721 new_string = string + "" 3722 new_string = string + " " 3723 string[:0]37243726 len(mapping) 3727 keys = mapping.keys() 3728 values = mapping.values() 3729 items = mapping.items() 3730 for key in keys: 3731 item = mapping[key] 3732 mapping["key"] = "value" 3733 self.assertEquals("value", mapping["key"])3734 3735 3736 if etree: 3739 3740 if ElementTree: 3743 3744 filter_by_version( 3745 ElementTreeTestCase, 3746 ElementTreeTestCase.required_versions_ET, ET_VERSION) 3747 3748 if cElementTree: 3751 3752 filter_by_version( 3753 CElementTreeTestCase, 3754 CElementTreeTestCase.required_versions_cET, CET_VERSION) 37553757 suite = unittest.TestSuite() 3758 if etree: 3759 suite.addTests([unittest.makeSuite(ETreeTestCase)]) 3760 if ElementTree: 3761 suite.addTests([unittest.makeSuite(ElementTreeTestCase)]) 3762 if cElementTree: 3763 suite.addTests([unittest.makeSuite(CElementTreeTestCase)]) 3764 return suite3765 3766 if __name__ == '__main__': 3767 print('to test use test.py %s' % __file__) 3768
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Sat Jun 19 12:38:04 2010 | http://epydoc.sourceforge.net |