Home | Trees | Indices | Help |
|
---|
|
1 # -*- coding: utf-8 -*- 2 3 """ 4 Tests specific to the extended etree API 5 6 Tests that apply to the general ElementTree API should go into 7 test_elementtree 8 """ 9 10 11 import unittest, copy, sys, operator 12 13 from common_imports import etree, StringIO, HelperTestCase, fileInTestDir 14 from common_imports import SillyFileLike, canonicalize, doctest 15 16 print 17 print "TESTED VERSION:", etree.__version__ 18 print " Python: ", sys.version_info 19 print " lxml.etree: ", etree.LXML_VERSION 20 print " libxml used: ", etree.LIBXML_VERSION 21 print " libxml compiled: ", etree.LIBXML_COMPILED_VERSION 22 print " libxslt used: ", etree.LIBXSLT_VERSION 23 print " libxslt compiled: ", etree.LIBXSLT_COMPILED_VERSION 24 print 25 26 try: 27 sorted 28 except NameError: 29 # Python 2.3 3436 """Tests only for etree, not ElementTree""" 37 etree = etree 38529 530 parser.resolvers.add(MyResolver()) 531 532 xml = u'<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>' % test_url 533 tree = parse(StringIO(xml), parser) 534 root = tree.getroot() 535 self.assertEquals(root.text, test_url) 53640 self.assert_(isinstance(etree.__version__, str)) 41 self.assert_(isinstance(etree.LXML_VERSION, tuple)) 42 self.assertEqual(len(etree.LXML_VERSION), 4) 43 self.assert_(isinstance(etree.LXML_VERSION[0], int)) 44 self.assert_(isinstance(etree.LXML_VERSION[1], int)) 45 self.assert_(isinstance(etree.LXML_VERSION[2], int)) 46 self.assert_(isinstance(etree.LXML_VERSION[3], int)) 47 self.assert_(etree.__version__.startswith( 48 str(etree.LXML_VERSION[0])))4951 if hasattr(self.etree, '__pyx_capi__'): 52 # newer Pyrex compatible C-API 53 self.assert_(isinstance(self.etree.__pyx_capi__, dict)) 54 self.assert_(len(self.etree.__pyx_capi__) > 0) 55 else: 56 # older C-API mechanism 57 self.assert_(hasattr(self.etree, '_import_c_api'))5860 Element = self.etree.Element 61 el = Element('name') 62 self.assertEquals(el.tag, 'name') 63 el = Element('{}name') 64 self.assertEquals(el.tag, 'name')6567 Element = self.etree.Element 68 el = Element('name') 69 self.assertRaises(ValueError, Element, '{}') 70 self.assertRaises(ValueError, setattr, el, 'tag', '{}') 71 72 self.assertRaises(ValueError, Element, '{test}') 73 self.assertRaises(ValueError, setattr, el, 'tag', '{test}')7476 Element = self.etree.Element 77 self.assertRaises(ValueError, Element, 'p:name') 78 self.assertRaises(ValueError, Element, '{test}p:name') 79 80 el = Element('name') 81 self.assertRaises(ValueError, setattr, el, 'tag', 'p:name')8284 Element = self.etree.Element 85 self.assertRaises(ValueError, Element, "p'name") 86 self.assertRaises(ValueError, Element, 'p"name') 87 88 self.assertRaises(ValueError, Element, "{test}p'name") 89 self.assertRaises(ValueError, Element, '{test}p"name') 90 91 el = Element('name') 92 self.assertRaises(ValueError, setattr, el, 'tag', "p'name") 93 self.assertRaises(ValueError, setattr, el, 'tag', 'p"name')9496 Element = self.etree.Element 97 self.assertRaises(ValueError, Element, ' name ') 98 self.assertRaises(ValueError, Element, 'na me') 99 self.assertRaises(ValueError, Element, '{test} name') 100 101 el = Element('name') 102 self.assertRaises(ValueError, setattr, el, 'tag', ' name ')103105 Element = self.etree.Element 106 SubElement = self.etree.SubElement 107 108 el = Element('name') 109 self.assertRaises(ValueError, SubElement, el, '{}') 110 self.assertRaises(ValueError, SubElement, el, '{test}')111113 Element = self.etree.Element 114 SubElement = self.etree.SubElement 115 116 el = Element('name') 117 self.assertRaises(ValueError, SubElement, el, 'p:name') 118 self.assertRaises(ValueError, SubElement, el, '{test}p:name')119121 Element = self.etree.Element 122 SubElement = self.etree.SubElement 123 124 el = Element('name') 125 self.assertRaises(ValueError, SubElement, el, "p'name") 126 self.assertRaises(ValueError, SubElement, el, "{test}p'name") 127 128 self.assertRaises(ValueError, SubElement, el, 'p"name') 129 self.assertRaises(ValueError, SubElement, el, '{test}p"name')130132 Element = self.etree.Element 133 SubElement = self.etree.SubElement 134 135 el = Element('name') 136 self.assertRaises(ValueError, SubElement, el, ' name ') 137 self.assertRaises(ValueError, SubElement, el, 'na me') 138 self.assertRaises(ValueError, SubElement, el, '{test} name')139141 QName = self.etree.QName 142 self.assertRaises(ValueError, QName, '') 143 self.assertRaises(ValueError, QName, 'test', '')144146 QName = self.etree.QName 147 self.assertRaises(ValueError, QName, 'p:name') 148 self.assertRaises(ValueError, QName, 'test', 'p:name')149151 QName = self.etree.QName 152 self.assertRaises(ValueError, QName, ' name ') 153 self.assertRaises(ValueError, QName, 'na me') 154 self.assertRaises(ValueError, QName, 'test', ' name')155157 # ET doesn't resove QNames as text values 158 etree = self.etree 159 qname = etree.QName('http://myns', 'a') 160 a = etree.Element(qname, nsmap={'p' : 'http://myns'}) 161 a.text = qname 162 163 self.assertEquals("p:a", a.text)164166 Element = self.etree.Element 167 root = Element("root") 168 root.set("attr", "TEST") 169 self.assertEquals("TEST", root.get("attr"))170172 # ElementTree accepts arbitrary attribute values 173 # lxml.etree allows only strings 174 Element = self.etree.Element 175 root = Element("root") 176 self.assertRaises(TypeError, root.set, "newattr", 5) 177 self.assertRaises(TypeError, root.set, "newattr", None)178180 ElementTree = self.etree.ElementTree 181 182 f = StringIO('<doc one="One" two="Two"/>') 183 doc = ElementTree(file=f) 184 root = doc.getroot() 185 self.assertEquals('One', root.attrib['one']) 186 self.assertEquals('Two', root.attrib['two']) 187 188 self.assertEquals('One', root.attrib.pop('one')) 189 190 self.assertEquals(None, root.attrib.get('one')) 191 self.assertEquals('Two', root.attrib['two'])192194 root = self.etree.XML('<doc one="One" two="Two"/>') 195 self.assertRaises(KeyError, root.attrib.pop, 'NONE') 196 197 self.assertEquals('One', root.attrib['one']) 198 self.assertEquals('Two', root.attrib['two'])199201 root = self.etree.XML('<doc one="One" two="Two"/>') 202 self.assertEquals('Three', root.attrib.pop('three', 'Three'))203205 root = self.etree.XML('<doc/>') 206 self.assertEquals('Three', root.attrib.pop('three', 'Three'))207209 root = self.etree.XML('<doc one="One" two="Two"/>') 210 self.assertRaises(TypeError, root.attrib.pop, 'One', None, None)211213 # lxml.etree separates target and text 214 Element = self.etree.Element 215 SubElement = self.etree.SubElement 216 ProcessingInstruction = self.etree.ProcessingInstruction 217 218 a = Element('a') 219 a.append(ProcessingInstruction('foo', 'some more text')) 220 self.assertEquals(a[0].target, 'foo') 221 self.assertEquals(a[0].text, 'some more text')222224 XML = self.etree.XML 225 root = XML("<test><?mypi my test ?></test>") 226 self.assertEquals(root[0].target, "mypi") 227 self.assertEquals(root[0].text, "my test ")228230 # previously caused a crash 231 ProcessingInstruction = self.etree.ProcessingInstruction 232 233 a = ProcessingInstruction("PI", "ONE") 234 b = copy.deepcopy(a) 235 b.text = "ANOTHER" 236 237 self.assertEquals('ONE', a.text) 238 self.assertEquals('ANOTHER', b.text)239241 # previously caused a crash 242 # not supported by ET! 243 Comment = self.etree.Comment 244 245 a = Comment("ONE") 246 b = copy.deepcopy(a) 247 b.text = "ANOTHER" 248 249 self.assertEquals('ONE', a.text) 250 self.assertEquals('ANOTHER', b.text)251253 # ElementTree accepts arbitrary attribute values 254 # lxml.etree allows only strings 255 Element = self.etree.Element 256 257 root = Element("root") 258 root.set("attr", "TEST") 259 self.assertEquals("TEST", root.get("attr")) 260 self.assertRaises(TypeError, root.set, "newattr", 5)261263 # ET raises ExpatError 264 parse = self.etree.parse 265 # from StringIO 266 f = StringIO('<a><b></c></b></a>') 267 self.assertRaises(SyntaxError, parse, f) 268 f.close()269271 parse = self.etree.parse 272 tostring = self.etree.tostring 273 XMLParser = self.etree.XMLParser 274 275 f = StringIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>') 276 parser = XMLParser(remove_comments=True) 277 tree = parse(f, parser) 278 self.assertEquals( 279 '<a><b><c/></b></a>', 280 tostring(tree))281283 parse = self.etree.parse 284 tostring = self.etree.tostring 285 XMLParser = self.etree.XMLParser 286 287 xml = '<?test?><a><?A?><b><?B?><c/></b><?C?></a><?tail?>' 288 289 f = StringIO(xml) 290 tree = parse(f) 291 self.assertEquals( 292 xml, 293 tostring(tree)) 294 295 f = StringIO(xml) 296 parser = XMLParser(remove_pis=True) 297 tree = parse(f, parser) 298 self.assertEquals( 299 '<a><b><c/></b></a>', 300 tostring(tree))301303 # ET raises IOError only 304 parse = self.etree.parse 305 self.assertRaises(TypeError, parse, 'notthere.xml', object())306308 parse = self.etree.parse 309 # from StringIO 310 f = StringIO('<a><b></c></b></a>') 311 self.etree.clearErrorLog() 312 try: 313 parse(f) 314 logs = None 315 except SyntaxError, e: 316 logs = e.error_log 317 f.close() 318 self.assert_([ log for log in logs 319 if 'mismatch' in log.message ]) 320 self.assert_([ log for log in logs 321 if 'PARSER' in log.domain_name]) 322 self.assert_([ log for log in logs 323 if 'TAG_NAME_MISMATCH' in log.type_name ]) 324 self.assert_([ log for log in logs 325 if 1 == log.line ]) 326 self.assert_([ log for log in logs 327 if 15 == log.column ])328330 parse = self.etree.parse 331 # from file 332 f = open(fileInTestDir('test_broken.xml'), 'r') 333 self.assertRaises(SyntaxError, parse, f) 334 f.close()335337 # ET removes comments 338 iterparse = self.etree.iterparse 339 tostring = self.etree.tostring 340 341 f = StringIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>') 342 events = list(iterparse(f)) 343 root = events[-1][1] 344 self.assertEquals(3, len(events)) 345 self.assertEquals( 346 '<a><!--A--><b><!-- B --><c/></b><!--C--></a>', 347 tostring(root))348350 iterparse = self.etree.iterparse 351 tostring = self.etree.tostring 352 353 f = StringIO('<a><!--A--><b><!-- B --><c/></b><!--C--></a>') 354 events = list(iterparse(f, remove_comments=True)) 355 root = events[-1][1] 356 self.assertEquals( 357 '<a><b><c/></b></a>', 358 tostring(root))359361 iterparse = self.etree.iterparse 362 f = StringIO('<a><b><c/></a>') 363 # ET raises ExpatError, lxml raises XMLSyntaxError 364 self.assertRaises(self.etree.XMLSyntaxError, list, iterparse(f))365367 iterparse = self.etree.iterparse 368 f = StringIO(""" 369 <a> \n \n <b> b test </b> \n 370 371 \n\t <c> \n </c> </a> \n """) 372 iterator = iterparse(f, remove_blank_text=True) 373 text = [ (element.text, element.tail) 374 for event, element in iterator ] 375 self.assertEquals( 376 [(" b test ", None), (" \n ", None), (None, None)], 377 text)378380 iterparse = self.etree.iterparse 381 f = StringIO('<a><b><d/></b><c/></a>') 382 383 iterator = iterparse(f, tag="b", events=('start', 'end')) 384 events = list(iterator) 385 root = iterator.root 386 self.assertEquals( 387 [('start', root[0]), ('end', root[0])], 388 events)389391 iterparse = self.etree.iterparse 392 f = StringIO('<a><b><d/></b><c/></a>') 393 394 iterator = iterparse(f, tag="*", events=('start', 'end')) 395 events = list(iterator) 396 self.assertEquals( 397 8, 398 len(events))399401 text = u'Søk på nettet' 402 wrong_declaration = "<?xml version='1.0' encoding='UTF-8'?>" 403 xml_latin1 = (u'%s<a>%s</a>' % (wrong_declaration, text) 404 ).encode('iso-8859-1') 405 406 self.assertRaises(self.etree.ParseError, 407 list, self.etree.iterparse(StringIO(xml_latin1))) 408 409 iterator = self.etree.iterparse(StringIO(xml_latin1), 410 encoding="iso-8859-1") 411 self.assertEquals(1, len(list(iterator))) 412 413 a = iterator.root 414 self.assertEquals(a.text, text)415 419421 iterwalk = self.etree.iterwalk 422 root = self.etree.XML('<a><b><d/></b><c/></a>') 423 424 iterator = iterwalk(root, tag="b", events=('start', 'end')) 425 events = list(iterator) 426 self.assertEquals( 427 [('start', root[0]), ('end', root[0])], 428 events)429431 iterwalk = self.etree.iterwalk 432 root = self.etree.XML('<a><b><d/></b><c/></a>') 433 434 iterator = iterwalk(root, tag="*", events=('start', 'end')) 435 events = list(iterator) 436 self.assertEquals( 437 8, 438 len(events))439441 iterwalk = self.etree.iterwalk 442 root = self.etree.XML('<a><b></b><c/></a>') 443 444 events = list(iterwalk(root)) 445 self.assertEquals( 446 [('end', root[0]), ('end', root[1]), ('end', root)], 447 events)448450 iterwalk = self.etree.iterwalk 451 root = self.etree.XML('<a><b></b><c/></a>') 452 453 iterator = iterwalk(root, events=('start',)) 454 events = list(iterator) 455 self.assertEquals( 456 [('start', root), ('start', root[0]), ('start', root[1])], 457 events)458460 iterwalk = self.etree.iterwalk 461 root = self.etree.XML('<a><b></b><c/></a>') 462 463 iterator = iterwalk(root, events=('start','end')) 464 events = list(iterator) 465 self.assertEquals( 466 [('start', root), ('start', root[0]), ('end', root[0]), 467 ('start', root[1]), ('end', root[1]), ('end', root)], 468 events)469471 iterwalk = self.etree.iterwalk 472 root = self.etree.XML('<a><b></b><c/></a>') 473 474 iterator = iterwalk(root) 475 for event, elem in iterator: 476 elem.clear() 477 478 self.assertEquals(0, 479 len(root))480482 iterwalk = self.etree.iterwalk 483 root = self.etree.XML('<a xmlns="ns1"><b><c xmlns="ns2"/></b></a>') 484 485 attr_name = '{testns}bla' 486 events = [] 487 iterator = iterwalk(root, events=('start','end','start-ns','end-ns')) 488 for event, elem in iterator: 489 events.append(event) 490 if event == 'start': 491 if elem.tag != '{ns1}a': 492 elem.set(attr_name, 'value') 493 494 self.assertEquals( 495 ['start-ns', 'start', 'start', 'start-ns', 'start', 496 'end', 'end-ns', 'end', 'end', 'end-ns'], 497 events) 498 499 self.assertEquals( 500 None, 501 root.get(attr_name)) 502 self.assertEquals( 503 'value', 504 root[0].get(attr_name))505507 iterwalk = self.etree.iterwalk 508 root = self.etree.XML('<a><b><d/></b><c/></a>') 509 510 counts = [] 511 for event, elem in iterwalk(root): 512 counts.append(len(list(elem.getiterator()))) 513 self.assertEquals( 514 [1,2,1,4], 515 counts)516518 parse = self.etree.parse 519 parser = self.etree.XMLParser(dtd_validation=True) 520 assertEqual = self.assertEqual 521 test_url = u"__nosuch.dtd" 522 523 class MyResolver(self.etree.Resolver): 524 def resolve(self, url, id, context): 525 assertEqual(url, test_url) 526 return self.resolve_string( 527 u'''<!ENTITY myentity "%s"> 528 <!ELEMENT doc ANY>''' % url, context)538 parse = self.etree.parse 539 parser = self.etree.XMLParser(load_dtd=True) 540 assertEqual = self.assertEqual 541 test_url = u"__nosuch.dtd" 542 543 class check(object): 544 resolved = False545 546 class MyResolver(self.etree.Resolver): 547 def resolve(self, url, id, context): 548 assertEqual(url, test_url) 549 check.resolved = True 550 return self.resolve_empty(context) 551 552 parser.resolvers.add(MyResolver()) 553 554 xml = u'<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>' % test_url 555 self.assertRaises(etree.XMLSyntaxError, parse, StringIO(xml), parser) 556 self.assert_(check.resolved) 557559 parse = self.etree.parse 560 parser = self.etree.XMLParser(dtd_validation=True) 561 test_url = u"__nosuch.dtd" 562 563 class _LocalException(Exception): 564 pass565 566 class MyResolver(self.etree.Resolver): 567 def resolve(self, url, id, context): 568 raise _LocalException 569 570 parser.resolvers.add(MyResolver()) 571 572 xml = u'<!DOCTYPE doc SYSTEM "test"><doc>&myentity;</doc>' 573 self.assertRaises(_LocalException, parse, StringIO(xml), parser) 574 575 if etree.LIBXML_VERSION > (2,6,20):577 parse = self.etree.parse 578 tostring = self.etree.tostring 579 parser = self.etree.XMLParser(resolve_entities=False) 580 Entity = self.etree.Entity 581 582 xml = '<!DOCTYPE doc SYSTEM "test"><doc>&myentity;</doc>' 583 tree = parse(StringIO(xml), parser) 584 root = tree.getroot() 585 self.assertEquals(root[0].tag, Entity) 586 self.assertFalse(root[0].text) 587 self.assertEquals(root[0].tail, None) 588 self.assertEquals(root[0].name, "myentity") 589 590 self.assertEquals('<doc>&myentity;</doc>', 591 tostring(root))592594 Entity = self.etree.Entity 595 Element = self.etree.Element 596 tostring = self.etree.tostring 597 598 root = Element("root") 599 root.append( Entity("test") ) 600 601 self.assertEquals(root[0].tag, Entity) 602 self.assertFalse(root[0].text) 603 self.assertEquals(root[0].tail, None) 604 self.assertEquals(root[0].name, "test") 605 606 self.assertEquals('<root>&test;</root>', 607 tostring(root))608 609 # TypeError in etree, AssertionError in ElementTree;611 Element = self.etree.Element 612 SubElement = self.etree.SubElement 613 614 a = Element('a') 615 b = SubElement(a, 'b') 616 617 self.assertRaises(TypeError, 618 a.__setitem__, 0, 'foo')619621 # raises AssertionError in ElementTree 622 Element = self.etree.Element 623 self.assertRaises(TypeError, Element('a').append, None)624626 Element = self.etree.Element 627 SubElement = self.etree.SubElement 628 root = Element('root') 629 SubElement(root, 'a') 630 SubElement(root, 'b') 631 632 self.assertEquals(['a', 'b'], 633 [c.tag for c in root]) 634 root[1].addnext(root[0]) 635 self.assertEquals(['b', 'a'], 636 [c.tag for c in root])637639 Element = self.etree.Element 640 SubElement = self.etree.SubElement 641 root = Element('root') 642 SubElement(root, 'a') 643 SubElement(root, 'b') 644 645 self.assertEquals(['a', 'b'], 646 [c.tag for c in root]) 647 root[0].addprevious(root[1]) 648 self.assertEquals(['b', 'a'], 649 [c.tag for c in root])650652 Element = self.etree.Element 653 a = Element('a') 654 b = Element('b') 655 self.assertRaises(TypeError, a.addnext, b)656658 Element = self.etree.Element 659 a = Element('a') 660 b = Element('b') 661 self.assertRaises(TypeError, a.addnext, b)662664 Element = self.etree.Element 665 SubElement = self.etree.SubElement 666 PI = self.etree.PI 667 root = Element('root') 668 SubElement(root, 'a') 669 pi = PI('TARGET', 'TEXT') 670 pi.tail = "TAIL" 671 672 self.assertEquals('<root><a></a></root>', 673 self._writeElement(root)) 674 root[0].addprevious(pi) 675 self.assertEquals('<root><?TARGET TEXT?>TAIL<a></a></root>', 676 self._writeElement(root))677679 Element = self.etree.Element 680 PI = self.etree.PI 681 root = Element('root') 682 pi = PI('TARGET', 'TEXT') 683 pi.tail = "TAIL" 684 685 self.assertEquals('<root></root>', 686 self._writeElement(root)) 687 root.addprevious(pi) 688 self.assertEquals('<?TARGET TEXT?>\n<root></root>', 689 self._writeElement(root))690692 Element = self.etree.Element 693 SubElement = self.etree.SubElement 694 PI = self.etree.PI 695 root = Element('root') 696 SubElement(root, 'a') 697 pi = PI('TARGET', 'TEXT') 698 pi.tail = "TAIL" 699 700 self.assertEquals('<root><a></a></root>', 701 self._writeElement(root)) 702 root[0].addnext(pi) 703 self.assertEquals('<root><a></a><?TARGET TEXT?>TAIL</root>', 704 self._writeElement(root))705707 Element = self.etree.Element 708 PI = self.etree.PI 709 root = Element('root') 710 pi = PI('TARGET', 'TEXT') 711 pi.tail = "TAIL" 712 713 self.assertEquals('<root></root>', 714 self._writeElement(root)) 715 root.addnext(pi) 716 self.assertEquals('<root></root>\n<?TARGET TEXT?>', 717 self._writeElement(root))718720 Element = self.etree.Element 721 SubElement = self.etree.SubElement 722 Comment = self.etree.Comment 723 root = Element('root') 724 SubElement(root, 'a') 725 comment = Comment('TEXT ') 726 comment.tail = "TAIL" 727 728 self.assertEquals('<root><a></a></root>', 729 self._writeElement(root)) 730 root[0].addnext(comment) 731 self.assertEquals('<root><a></a><!--TEXT -->TAIL</root>', 732 self._writeElement(root))733735 Element = self.etree.Element 736 Comment = self.etree.Comment 737 root = Element('root') 738 comment = Comment('TEXT ') 739 comment.tail = "TAIL" 740 741 self.assertEquals('<root></root>', 742 self._writeElement(root)) 743 root.addnext(comment) 744 self.assertEquals('<root></root>\n<!--TEXT -->', 745 self._writeElement(root))746748 Element = self.etree.Element 749 SubElement = self.etree.SubElement 750 Comment = self.etree.Comment 751 root = Element('root') 752 SubElement(root, 'a') 753 comment = Comment('TEXT ') 754 comment.tail = "TAIL" 755 756 self.assertEquals('<root><a></a></root>', 757 self._writeElement(root)) 758 root[0].addprevious(comment) 759 self.assertEquals('<root><!--TEXT -->TAIL<a></a></root>', 760 self._writeElement(root))761763 Element = self.etree.Element 764 Comment = self.etree.Comment 765 root = Element('root') 766 comment = Comment('TEXT ') 767 comment.tail = "TAIL" 768 769 self.assertEquals('<root></root>', 770 self._writeElement(root)) 771 root.addprevious(comment) 772 self.assertEquals('<!--TEXT -->\n<root></root>', 773 self._writeElement(root))774 775 # ET's Elements have items() and key(), but not values()777 XML = self.etree.XML 778 779 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>') 780 values = root.values() 781 values.sort() 782 self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)783 784 # gives error in ElementTree786 Element = self.etree.Element 787 Comment = self.etree.Comment 788 789 a = Element('a') 790 a.append(Comment()) 791 self.assertEquals( 792 '<a><!----></a>', 793 self._writeElement(a))794 795 # ElementTree ignores comments797 ElementTree = self.etree.ElementTree 798 tostring = self.etree.tostring 799 800 xml = '<a><b/><!----><c/></a>' 801 f = StringIO(xml) 802 doc = ElementTree(file=f) 803 a = doc.getroot() 804 self.assertEquals( 805 '', 806 a[1].text) 807 self.assertEquals( 808 xml, 809 tostring(a))810 811 # ElementTree ignores comments813 ElementTree = self.etree.ElementTree 814 815 f = StringIO('<a><b></b><!-- hoi --><c></c></a>') 816 doc = ElementTree(file=f) 817 a = doc.getroot() 818 self.assertEquals( 819 ' hoi ', 820 a[1].text)821 822 # ElementTree adds whitespace around comments824 Element = self.etree.Element 825 Comment = self.etree.Comment 826 tostring = self.etree.tostring 827 828 a = Element('a') 829 a.append(Comment('foo')) 830 self.assertEquals( 831 '<a><!--foo--></a>', 832 tostring(a)) 833 834 a[0].text = "TEST" 835 self.assertEquals( 836 '<a><!--TEST--></a>', 837 tostring(a))838 839 # ElementTree adds whitespace around comments841 Element = self.etree.Element 842 Comment = self.etree.Comment 843 tostring = self.etree.tostring 844 845 a = Element('a') 846 a.append(Comment(' foo ')) 847 self.assertEquals( 848 '<a><!-- foo --></a>', 849 tostring(a))850 851 # does not raise an exception in ElementTree853 Element = self.etree.Element 854 Comment = self.etree.Comment 855 856 c = Comment() 857 el = Element('myel') 858 859 self.assertRaises(TypeError, c.append, el) 860 self.assertRaises(TypeError, c.insert, 0, el) 861 self.assertRaises(TypeError, c.set, "myattr", "test")862 863 # test weird dictionary interaction leading to segfault previously865 root = self.etree.Element('root') 866 add = self.etree.ElementTree(file=StringIO('<foo>Foo</foo>')) 867 root.append(self.etree.Element('baz'))868 869 # test passing 'None' to dump 872874 ElementTree = self.etree.ElementTree 875 876 f = StringIO('<a xmlns:foo="http://www.infrae.com/ns/1"><foo:b/></a>') 877 doc = ElementTree(file=f) 878 a = doc.getroot() 879 self.assertEquals( 880 None, 881 a.prefix) 882 self.assertEquals( 883 'foo', 884 a[0].prefix)885887 ElementTree = self.etree.ElementTree 888 889 f = StringIO('<a xmlns="http://www.infrae.com/ns/1"><b/></a>') 890 doc = ElementTree(file=f) 891 a = doc.getroot() 892 self.assertEquals( 893 None, 894 a.prefix) 895 self.assertEquals( 896 None, 897 a[0].prefix)898900 Element = self.etree.Element 901 SubElement = self.etree.SubElement 902 903 a = Element('a') 904 b = SubElement(a, 'b') 905 c = SubElement(a, 'c') 906 d = SubElement(b, 'd') 907 self.assertEquals( 908 None, 909 a.getparent()) 910 self.assertEquals( 911 a, 912 b.getparent()) 913 self.assertEquals( 914 b.getparent(), 915 c.getparent()) 916 self.assertEquals( 917 b, 918 d.getparent())919921 XML = self.etree.XML 922 923 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>') 924 result = [] 925 for el in root.iterchildren(): 926 result.append(el.tag) 927 self.assertEquals(['one', 'two', 'three'], result)928930 XML = self.etree.XML 931 932 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>') 933 result = [] 934 for el in root.iterchildren(reversed=True): 935 result.append(el.tag) 936 self.assertEquals(['three', 'two', 'one'], result)937939 XML = self.etree.XML 940 941 root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>') 942 result = [] 943 for el in root.iterchildren(tag='two'): 944 result.append(el.text) 945 self.assertEquals(['Two', 'Bla'], result)946948 XML = self.etree.XML 949 950 root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>') 951 result = [] 952 for el in root.iterchildren(reversed=True, tag='two'): 953 result.append(el.text) 954 self.assertEquals(['Bla', 'Two'], result)955957 Element = self.etree.Element 958 SubElement = self.etree.SubElement 959 960 a = Element('a') 961 b = SubElement(a, 'b') 962 c = SubElement(a, 'c') 963 d = SubElement(b, 'd') 964 self.assertEquals( 965 [], 966 list(a.iterancestors())) 967 self.assertEquals( 968 [a], 969 list(b.iterancestors())) 970 self.assertEquals( 971 a, 972 c.iterancestors().next()) 973 self.assertEquals( 974 [b, a], 975 list(d.iterancestors()))976978 Element = self.etree.Element 979 SubElement = self.etree.SubElement 980 981 a = Element('a') 982 b = SubElement(a, 'b') 983 c = SubElement(a, 'c') 984 d = SubElement(b, 'd') 985 self.assertEquals( 986 [a], 987 list(d.iterancestors(tag='a')))988990 Element = self.etree.Element 991 SubElement = self.etree.SubElement 992 993 a = Element('a') 994 b = SubElement(a, 'b') 995 c = SubElement(a, 'c') 996 d = SubElement(b, 'd') 997 e = SubElement(c, 'e') 998 999 self.assertEquals( 1000 [b, d, c, e], 1001 list(a.iterdescendants())) 1002 self.assertEquals( 1003 [], 1004 list(d.iterdescendants()))10051007 Element = self.etree.Element 1008 SubElement = self.etree.SubElement 1009 1010 a = Element('a') 1011 b = SubElement(a, 'b') 1012 c = SubElement(a, 'c') 1013 d = SubElement(b, 'd') 1014 e = SubElement(c, 'e') 1015 1016 self.assertEquals( 1017 [], 1018 list(a.iterdescendants('a'))) 1019 a2 = SubElement(e, 'a') 1020 self.assertEquals( 1021 [a2], 1022 list(a.iterdescendants('a'))) 1023 self.assertEquals( 1024 [a2], 1025 list(c.iterdescendants('a')))10261028 Element = self.etree.Element 1029 SubElement = self.etree.SubElement 1030 1031 a = Element('a') 1032 b = SubElement(a, 'b') 1033 c = SubElement(a, 'c') 1034 d = SubElement(b, 'd') 1035 self.assertEquals( 1036 a, 1037 a.getroottree().getroot()) 1038 self.assertEquals( 1039 a, 1040 b.getroottree().getroot()) 1041 self.assertEquals( 1042 a, 1043 d.getroottree().getroot())10441046 Element = self.etree.Element 1047 SubElement = self.etree.SubElement 1048 1049 a = Element('a') 1050 b = SubElement(a, 'b') 1051 c = SubElement(a, 'c') 1052 self.assertEquals( 1053 None, 1054 a.getnext()) 1055 self.assertEquals( 1056 c, 1057 b.getnext()) 1058 self.assertEquals( 1059 None, 1060 c.getnext())10611063 Element = self.etree.Element 1064 SubElement = self.etree.SubElement 1065 1066 a = Element('a') 1067 b = SubElement(a, 'b') 1068 c = SubElement(a, 'c') 1069 d = SubElement(b, 'd') 1070 self.assertEquals( 1071 None, 1072 a.getprevious()) 1073 self.assertEquals( 1074 b, 1075 c.getprevious()) 1076 self.assertEquals( 1077 None, 1078 b.getprevious())10791081 Element = self.etree.Element 1082 SubElement = self.etree.SubElement 1083 1084 a = Element('a') 1085 b = SubElement(a, 'b') 1086 c = SubElement(a, 'c') 1087 d = SubElement(b, 'd') 1088 self.assertEquals( 1089 [], 1090 list(a.itersiblings())) 1091 self.assertEquals( 1092 [c], 1093 list(b.itersiblings())) 1094 self.assertEquals( 1095 c, 1096 b.itersiblings().next()) 1097 self.assertEquals( 1098 [], 1099 list(c.itersiblings())) 1100 self.assertEquals( 1101 [b], 1102 list(c.itersiblings(preceding=True))) 1103 self.assertEquals( 1104 [], 1105 list(b.itersiblings(preceding=True)))11061108 Element = self.etree.Element 1109 SubElement = self.etree.SubElement 1110 1111 a = Element('a') 1112 b = SubElement(a, 'b') 1113 c = SubElement(a, 'c') 1114 d = SubElement(b, 'd') 1115 self.assertEquals( 1116 [], 1117 list(a.itersiblings(tag='XXX'))) 1118 self.assertEquals( 1119 [c], 1120 list(b.itersiblings(tag='c'))) 1121 self.assertEquals( 1122 [b], 1123 list(c.itersiblings(preceding=True, tag='b'))) 1124 self.assertEquals( 1125 [], 1126 list(c.itersiblings(preceding=True, tag='c')))11271129 parseid = self.etree.parseid 1130 XML = self.etree.XML 1131 xml_text = ''' 1132 <!DOCTYPE document [ 1133 <!ELEMENT document (h1,p)*> 1134 <!ELEMENT h1 (#PCDATA)> 1135 <!ATTLIST h1 myid ID #REQUIRED> 1136 <!ELEMENT p (#PCDATA)> 1137 <!ATTLIST p someid ID #REQUIRED> 1138 ]> 1139 <document> 1140 <h1 myid="chapter1">...</h1> 1141 <p id="note1" class="note">...</p> 1142 <p>Regular paragraph.</p> 1143 <p xml:id="xmlid">XML:ID paragraph.</p> 1144 <p someid="warn1" class="warning">...</p> 1145 </document> 1146 ''' 1147 1148 tree, dic = parseid(StringIO(xml_text)) 1149 root = tree.getroot() 1150 root2 = XML(xml_text) 1151 self.assertEquals(self._writeElement(root), 1152 self._writeElement(root2)) 1153 expected = { 1154 "chapter1" : root[0], 1155 "xmlid" : root[3], 1156 "warn1" : root[4] 1157 } 1158 self.assert_("chapter1" in dic) 1159 self.assert_("warn1" in dic) 1160 self.assert_("xmlid" in dic) 1161 self._checkIDDict(dic, expected)11621164 XMLDTDID = self.etree.XMLDTDID 1165 XML = self.etree.XML 1166 xml_text = ''' 1167 <!DOCTYPE document [ 1168 <!ELEMENT document (h1,p)*> 1169 <!ELEMENT h1 (#PCDATA)> 1170 <!ATTLIST h1 myid ID #REQUIRED> 1171 <!ELEMENT p (#PCDATA)> 1172 <!ATTLIST p someid ID #REQUIRED> 1173 ]> 1174 <document> 1175 <h1 myid="chapter1">...</h1> 1176 <p id="note1" class="note">...</p> 1177 <p>Regular paragraph.</p> 1178 <p xml:id="xmlid">XML:ID paragraph.</p> 1179 <p someid="warn1" class="warning">...</p> 1180 </document> 1181 ''' 1182 1183 root, dic = XMLDTDID(xml_text) 1184 root2 = XML(xml_text) 1185 self.assertEquals(self._writeElement(root), 1186 self._writeElement(root2)) 1187 expected = { 1188 "chapter1" : root[0], 1189 "xmlid" : root[3], 1190 "warn1" : root[4] 1191 } 1192 self.assert_("chapter1" in dic) 1193 self.assert_("warn1" in dic) 1194 self.assert_("xmlid" in dic) 1195 self._checkIDDict(dic, expected)11961198 XMLDTDID = self.etree.XMLDTDID 1199 XML = self.etree.XML 1200 xml_text = ''' 1201 <document> 1202 <h1 myid="chapter1">...</h1> 1203 <p id="note1" class="note">...</p> 1204 <p>Regular paragraph.</p> 1205 <p someid="warn1" class="warning">...</p> 1206 </document> 1207 ''' 1208 1209 root, dic = XMLDTDID(xml_text) 1210 root2 = XML(xml_text) 1211 self.assertEquals(self._writeElement(root), 1212 self._writeElement(root2)) 1213 expected = {} 1214 self._checkIDDict(dic, expected)12151217 self.assertEquals(dic, expected) 1218 self.assertEquals(len(dic), 1219 len(expected)) 1220 self.assertEquals(sorted(dic.items()), 1221 sorted(expected.items())) 1222 self.assertEquals(sorted(dic.iteritems()), 1223 sorted(expected.iteritems())) 1224 self.assertEquals(sorted(dic.keys()), 1225 sorted(expected.keys())) 1226 self.assertEquals(sorted(dic.iterkeys()), 1227 sorted(expected.iterkeys())) 1228 self.assertEquals(sorted(dic.values()), 1229 sorted(expected.values())) 1230 self.assertEquals(sorted(dic.itervalues()), 1231 sorted(expected.itervalues()))12321234 etree = self.etree 1235 1236 r = {'foo': 'http://ns.infrae.com/foo'} 1237 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1238 self.assertEquals( 1239 'foo', 1240 e.prefix) 1241 self.assertEquals( 1242 '<foo:bar xmlns:foo="http://ns.infrae.com/foo"></foo:bar>', 1243 self._writeElement(e))12441246 etree = self.etree 1247 1248 r = {None: 'http://ns.infrae.com/foo'} 1249 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1250 self.assertEquals( 1251 None, 1252 e.prefix) 1253 self.assertEquals( 1254 '{http://ns.infrae.com/foo}bar', 1255 e.tag) 1256 self.assertEquals( 1257 '<bar xmlns="http://ns.infrae.com/foo"></bar>', 1258 self._writeElement(e))12591261 etree = self.etree 1262 1263 r = {None: 'http://ns.infrae.com/foo', 1264 'hoi': 'http://ns.infrae.com/hoi'} 1265 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1266 e.set('{http://ns.infrae.com/hoi}test', 'value') 1267 self.assertEquals( 1268 '<bar xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi" hoi:test="value"></bar>', 1269 self._writeElement(e))12701272 etree = self.etree 1273 r = {None: 'http://ns.infrae.com/foo', 1274 'hoi': 'http://ns.infrae.com/hoi'} 1275 e = etree.Element('{http://ns.infrae.com/foo}z', nsmap=r) 1276 tree = etree.ElementTree(element=e) 1277 etree.SubElement(e, '{http://ns.infrae.com/hoi}x') 1278 self.assertEquals( 1279 '<z xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi"><hoi:x></hoi:x></z>', 1280 self._writeElement(e))12811283 etree = self.etree 1284 1285 r = {None: 'http://ns.infrae.com/foo'} 1286 e1 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1287 e2 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1288 1289 e1.append(e2) 1290 1291 self.assertEquals( 1292 None, 1293 e1.prefix) 1294 self.assertEquals( 1295 None, 1296 e1[0].prefix) 1297 self.assertEquals( 1298 '{http://ns.infrae.com/foo}bar', 1299 e1.tag) 1300 self.assertEquals( 1301 '{http://ns.infrae.com/foo}bar', 1302 e1[0].tag)13031305 etree = self.etree 1306 1307 r = {None: 'http://ns.infrae.com/BAR'} 1308 e1 = etree.Element('{http://ns.infrae.com/BAR}bar', nsmap=r) 1309 e2 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1310 1311 e1.append(e2) 1312 1313 self.assertEquals( 1314 None, 1315 e1.prefix) 1316 self.assertNotEquals( 1317 None, 1318 e2.prefix) 1319 self.assertEquals( 1320 '{http://ns.infrae.com/BAR}bar', 1321 e1.tag) 1322 self.assertEquals( 1323 '{http://ns.infrae.com/foo}bar', 1324 e2.tag)13251327 ns_href = "http://a.b.c" 1328 one = self.etree.parse( 1329 StringIO('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href)) 1330 baz = one.getroot()[0][0] 1331 1332 two = self.etree.parse( 1333 StringIO('<root xmlns:ns="%s"/>' % ns_href)) 1334 two.getroot().append(baz) 1335 del one # make sure the source document is deallocated 1336 1337 self.assertEquals('{%s}baz' % ns_href, baz.tag) 1338 self.assertEquals( 1339 '<root xmlns:ns="%s"><ns:baz/></root>' % ns_href, 1340 self.etree.tostring(two))13411343 # FIXME: this currently fails - fix serializer.pxi! 1344 parse = self.etree.parse 1345 tostring = self.etree.tostring 1346 1347 ns_href = "http://a.b.c" 1348 one = parse( 1349 StringIO('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href)) 1350 baz = one.getroot()[0][0] 1351 1352 print tostring(baz) 1353 parsed = parse(StringIO( tostring(baz) )).getroot() 1354 1355 self.assertEquals('{%s}baz' % ns_href, parsed.tag)13561358 etree = self.etree 1359 1360 r = {None: 'http://ns.infrae.com/foo', 1361 'hoi': 'http://ns.infrae.com/hoi'} 1362 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) 1363 self.assertEquals( 1364 r, 1365 e.nsmap)13661368 etree = self.etree 1369 1370 re = {None: 'http://ns.infrae.com/foo', 1371 'hoi': 'http://ns.infrae.com/hoi'} 1372 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=re) 1373 1374 rs = {None: 'http://ns.infrae.com/honk', 1375 'top': 'http://ns.infrae.com/top'} 1376 s = etree.SubElement(e, '{http://ns.infrae.com/honk}bar', nsmap=rs) 1377 1378 r = re.copy() 1379 r.update(rs) 1380 self.assertEquals( 1381 re, 1382 e.nsmap) 1383 self.assertEquals( 1384 r, 1385 s.nsmap)13861388 Element = self.etree.Element 1389 SubElement = self.etree.SubElement 1390 1391 a = Element('{a}a') 1392 b = SubElement(a, '{a}b') 1393 c = SubElement(a, '{a}c') 1394 d = SubElement(b, '{b}d') 1395 e = SubElement(c, '{a}e') 1396 f = SubElement(c, '{b}f') 1397 1398 self.assertEquals( 1399 [a], 1400 list(a.getiterator('{a}a'))) 1401 self.assertEquals( 1402 [], 1403 list(a.getiterator('{b}a'))) 1404 self.assertEquals( 1405 [], 1406 list(a.getiterator('a'))) 1407 self.assertEquals( 1408 [f], 1409 list(c.getiterator('{b}*'))) 1410 self.assertEquals( 1411 [d, f], 1412 list(a.getiterator('{b}*')))14131415 Element = self.etree.Element 1416 Entity = self.etree.Entity 1417 SubElement = self.etree.SubElement 1418 1419 a = Element('a') 1420 b = SubElement(a, 'b') 1421 entity_b = Entity("TEST-b") 1422 b.append(entity_b) 1423 1424 self.assertEquals( 1425 [entity_b], 1426 list(a.getiterator(Entity))) 1427 1428 entity_a = Entity("TEST-a") 1429 a.append(entity_a) 1430 1431 self.assertEquals( 1432 [entity_b, entity_a], 1433 list(a.getiterator(Entity))) 1434 1435 self.assertEquals( 1436 [entity_b], 1437 list(b.getiterator(Entity)))14381440 Element = self.etree.Element 1441 Comment = self.etree.Comment 1442 PI = self.etree.PI 1443 SubElement = self.etree.SubElement 1444 1445 a = Element('a') 1446 b = SubElement(a, 'b') 1447 a.append(Comment("test")) 1448 a.append(PI("pi", "content")) 1449 c = SubElement(a, 'c') 1450 1451 self.assertEquals( 1452 [a, b, c], 1453 list(a.getiterator(Element)))14541456 # ElementTree iterates over everything here 1457 Element = self.etree.Element 1458 Comment = self.etree.Comment 1459 PI = self.etree.PI 1460 SubElement = self.etree.SubElement 1461 1462 a = Element('a') 1463 b = SubElement(a, 'b') 1464 a.append(Comment("test")) 1465 a.append(PI("pi", "content")) 1466 c = SubElement(a, 'c') 1467 1468 self.assertEquals( 1469 [a, b, c], 1470 list(a.getiterator('*')))14711473 # ET 1.3+ 1474 XML = self.etree.XML 1475 root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>") 1476 1477 text = list(root.itertext()) 1478 self.assertEquals(["RTEXT", "ATAIL", "CTEXT", "CTAIL"], 1479 text)14801482 # ET 1.3+ 1483 XML = self.etree.XML 1484 root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>") 1485 1486 text = list(root[2].itertext()) 1487 self.assertEquals(["CTEXT"], 1488 text)14891491 XML = self.etree.XML 1492 root = XML('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>') 1493 self.assertEquals(len(root.findall(".//{X}b")), 2) 1494 self.assertEquals(len(root.findall(".//{X}*")), 2) 1495 self.assertEquals(len(root.findall(".//b")), 3)14961498 etree = self.etree 1499 e = etree.Element('foo') 1500 for i in range(10): 1501 etree.SubElement(e, 'a%s' % i) 1502 for i in range(10): 1503 self.assertEquals( 1504 i, 1505 e.index(e[i])) 1506 self.assertEquals( 1507 3, e.index(e[3], 3)) 1508 self.assertRaises( 1509 ValueError, e.index, e[3], 4) 1510 self.assertRaises( 1511 ValueError, e.index, e[3], 0, 2) 1512 self.assertRaises( 1513 ValueError, e.index, e[8], 0, -3) 1514 self.assertRaises( 1515 ValueError, e.index, e[8], -5, -3) 1516 self.assertEquals( 1517 8, e.index(e[8], 0, -1)) 1518 self.assertEquals( 1519 8, e.index(e[8], -12, -1)) 1520 self.assertEquals( 1521 0, e.index(e[0], -12, -1))15221524 etree = self.etree 1525 e = etree.Element('foo') 1526 for i in range(10): 1527 el = etree.SubElement(e, 'a%s' % i) 1528 el.text = "text%d" % i 1529 el.tail = "tail%d" % i 1530 1531 child0 = e[0] 1532 child1 = e[1] 1533 child2 = e[2] 1534 1535 e.replace(e[0], e[1]) 1536 self.assertEquals( 1537 9, len(e)) 1538 self.assertEquals( 1539 child1, e[0]) 1540 self.assertEquals( 1541 child1.text, "text1") 1542 self.assertEquals( 1543 child1.tail, "tail1") 1544 self.assertEquals( 1545 child0.tail, "tail0") 1546 self.assertEquals( 1547 child2, e[1]) 1548 1549 e.replace(e[-1], e[0]) 1550 self.assertEquals( 1551 child1, e[-1]) 1552 self.assertEquals( 1553 child1.text, "text1") 1554 self.assertEquals( 1555 child1.tail, "tail1") 1556 self.assertEquals( 1557 child2, e[0])15581560 etree = self.etree 1561 e = etree.Element('foo') 1562 for i in range(10): 1563 etree.SubElement(e, 'a%s' % i) 1564 1565 new_element = etree.Element("test") 1566 new_element.text = "TESTTEXT" 1567 new_element.tail = "TESTTAIL" 1568 child1 = e[1] 1569 e.replace(e[0], new_element) 1570 self.assertEquals( 1571 new_element, e[0]) 1572 self.assertEquals( 1573 "TESTTEXT", 1574 e[0].text) 1575 self.assertEquals( 1576 "TESTTAIL", 1577 e[0].tail) 1578 self.assertEquals( 1579 child1, e[1])15801582 Element = self.etree.Element 1583 SubElement = self.etree.SubElement 1584 1585 a = Element('a') 1586 1587 e = Element('e') 1588 f = Element('f') 1589 g = Element('g') 1590 1591 s = [e, f, g] 1592 a[::-1] = s 1593 self.assertEquals( 1594 [g, f, e], 1595 list(a))15961598 Element = self.etree.Element 1599 SubElement = self.etree.SubElement 1600 1601 a = Element('a') 1602 b = SubElement(a, 'b') 1603 c = SubElement(a, 'c') 1604 d = SubElement(a, 'd') 1605 e = SubElement(a, 'e') 1606 1607 x = Element('x') 1608 y = Element('y') 1609 1610 a[1::2] = [x, y] 1611 self.assertEquals( 1612 [b, x, d, y], 1613 list(a))16141616 Element = self.etree.Element 1617 SubElement = self.etree.SubElement 1618 1619 a = Element('a') 1620 b = SubElement(a, 'b') 1621 c = SubElement(a, 'c') 1622 d = SubElement(a, 'd') 1623 e = SubElement(a, 'e') 1624 1625 x = Element('x') 1626 y = Element('y') 1627 1628 a[1::-1] = [x, y] 1629 self.assertEquals( 1630 [y, x, d, e], 1631 list(a))16321634 Element = self.etree.Element 1635 SubElement = self.etree.SubElement 1636 1637 a = Element('a') 1638 b = SubElement(a, 'b') 1639 c = SubElement(a, 'c') 1640 d = SubElement(a, 'd') 1641 e = SubElement(a, 'e') 1642 1643 x = Element('x') 1644 y = Element('y') 1645 1646 a[::-2] = [x, y] 1647 self.assertEquals( 1648 [b, y, d, x], 1649 list(a))16501652 Element = self.etree.Element 1653 SubElement = self.etree.SubElement 1654 try: 1655 slice 1656 except NameError: 1657 print "slice() not found" 1658 return 1659 1660 a = Element('a') 1661 b = SubElement(a, 'b') 1662 c = SubElement(a, 'c') 1663 d = SubElement(a, 'd') 1664 e = SubElement(a, 'e') 1665 1666 x = Element('x') 1667 y = Element('y') 1668 z = Element('z') 1669 1670 self.assertRaises( 1671 ValueError, 1672 operator.setitem, a, slice(1,None,2), [x, y, z]) 1673 1674 self.assertEquals( 1675 [b, c, d, e], 1676 list(a))16771679 etree = self.etree 1680 root = etree.Element('foo') 1681 for i in range(3): 1682 element = etree.SubElement(root, 'a%s' % i) 1683 element.text = "text%d" % i 1684 element.tail = "tail%d" % i 1685 1686 elements = [] 1687 for i in range(3): 1688 new_element = etree.Element("test%s" % i) 1689 new_element.text = "TEXT%s" % i 1690 new_element.tail = "TAIL%s" % i 1691 elements.append(new_element) 1692 1693 root.extend(elements) 1694 1695 self.assertEquals( 1696 ["a0", "a1", "a2", "test0", "test1", "test2"], 1697 [ el.tag for el in root ]) 1698 self.assertEquals( 1699 ["text0", "text1", "text2", "TEXT0", "TEXT1", "TEXT2"], 1700 [ el.text for el in root ]) 1701 self.assertEquals( 1702 ["tail0", "tail1", "tail2", "TAIL0", "TAIL1", "TAIL2"], 1703 [ el.tail for el in root ])17041706 XML = self.etree.XML 1707 root = XML('''<?xml version="1.0"?> 1708 <root><test> 1709 1710 <bla/></test> 1711 </root> 1712 ''') 1713 1714 self.assertEquals( 1715 [2, 2, 4], 1716 [ el.sourceline for el in root.getiterator() ])17171719 parse = self.etree.parse 1720 tree = parse(fileInTestDir('include/test_xinclude.xml')) 1721 1722 self.assertEquals( 1723 [1, 2, 3], 1724 [ el.sourceline for el in tree.getiterator() ])17251727 iterparse = self.etree.iterparse 1728 lines = list( 1729 el.sourceline for (event, el) in 1730 iterparse(fileInTestDir('include/test_xinclude.xml'))) 1731 1732 self.assertEquals( 1733 [2, 3, 1], 1734 lines)17351737 iterparse = self.etree.iterparse 1738 lines = list( 1739 el.sourceline for (event, el) in 1740 iterparse(fileInTestDir('include/test_xinclude.xml'), 1741 events=("start",))) 1742 1743 self.assertEquals( 1744 [1, 2, 3], 1745 lines)17461748 Element = self.etree.Element 1749 SubElement = self.etree.SubElement 1750 el = Element("test") 1751 self.assertEquals(None, el.sourceline) 1752 1753 child = SubElement(el, "test") 1754 self.assertEquals(None, el.sourceline) 1755 self.assertEquals(None, child.sourceline)17561758 etree = self.etree 1759 root = etree.XML("<root/>", base_url="http://no/such/url") 1760 docinfo = root.getroottree().docinfo 1761 self.assertEquals(docinfo.URL, "http://no/such/url")17621764 etree = self.etree 1765 root = etree.HTML("<html/>", base_url="http://no/such/url") 1766 docinfo = root.getroottree().docinfo 1767 self.assertEquals(docinfo.URL, "http://no/such/url")17681770 etree = self.etree 1771 xml_header = '<?xml version="1.0" encoding="ascii"?>' 1772 pub_id = "-//W3C//DTD XHTML 1.0 Transitional//EN" 1773 sys_id = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 1774 doctype_string = '<!DOCTYPE html PUBLIC "%s" "%s">' % (pub_id, sys_id) 1775 1776 xml = xml_header + doctype_string + '<html><body></body></html>' 1777 1778 tree = etree.parse(StringIO(xml)) 1779 docinfo = tree.docinfo 1780 self.assertEquals(docinfo.encoding, "ascii") 1781 self.assertEquals(docinfo.xml_version, "1.0") 1782 self.assertEquals(docinfo.public_id, pub_id) 1783 self.assertEquals(docinfo.system_url, sys_id) 1784 self.assertEquals(docinfo.root_name, 'html') 1785 self.assertEquals(docinfo.doctype, doctype_string)17861788 etree = self.etree 1789 xml_header = '<?xml version="1.0" encoding="UTF-8"?>' 1790 sys_id = "some.dtd" 1791 doctype_string = '<!DOCTYPE html SYSTEM "%s">' % sys_id 1792 xml = xml_header + doctype_string + '<html><body></body></html>' 1793 1794 tree = etree.parse(StringIO(xml)) 1795 docinfo = tree.docinfo 1796 self.assertEquals(docinfo.encoding, "UTF-8") 1797 self.assertEquals(docinfo.xml_version, "1.0") 1798 self.assertEquals(docinfo.public_id, None) 1799 self.assertEquals(docinfo.system_url, sys_id) 1800 self.assertEquals(docinfo.root_name, 'html') 1801 self.assertEquals(docinfo.doctype, doctype_string)18021804 etree = self.etree 1805 xml = '<html><body></body></html>' 1806 tree = etree.parse(StringIO(xml)) 1807 docinfo = tree.docinfo 1808 self.assertEquals(docinfo.encoding, None) 1809 self.assertEquals(docinfo.xml_version, "1.0") 1810 self.assertEquals(docinfo.public_id, None) 1811 self.assertEquals(docinfo.system_url, None) 1812 self.assertEquals(docinfo.root_name, 'html') 1813 self.assertEquals(docinfo.doctype, '')18141816 # check that DTDs that go in also go back out 1817 xml = '''\ 1818 <!DOCTYPE test SYSTEM "test.dtd" [ 1819 <!ENTITY entity "tasty"> 1820 <!ELEMENT test (a)> 1821 <!ELEMENT a (#PCDATA)> 1822 ]> 1823 <test><a>test-test</a></test>\ 1824 ''' 1825 root = self.etree.parse(StringIO(xml)) 1826 self.assertEqual(self.etree.tostring(root).replace(" ", ""), 1827 xml.replace(" ", ""))18281830 Element = self.etree.Element 1831 1832 a = Element('a') 1833 self.assertRaises(AssertionError, setattr, a, "text", 'ha\0ho') 1834 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\0ho') 1835 1836 self.assertRaises(AssertionError, Element, 'ha\0ho')18371839 Element = self.etree.Element 1840 1841 a = Element('a') 1842 self.assertRaises(AssertionError, setattr, a, "text", u'ha\0ho') 1843 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\0ho') 1844 1845 self.assertRaises(AssertionError, Element, u'ha\0ho')18461848 Element = self.etree.Element 1849 1850 a = Element('a') 1851 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x07ho') 1852 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x02ho') 1853 1854 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x07ho') 1855 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x02ho') 1856 1857 self.assertRaises(AssertionError, Element, 'ha\x07ho') 1858 self.assertRaises(AssertionError, Element, 'ha\x02ho')18591861 Element = self.etree.Element 1862 1863 a = Element('a') 1864 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x07ho') 1865 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x02ho') 1866 1867 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x07ho') 1868 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x02ho') 1869 1870 self.assertRaises(AssertionError, Element, u'ha\x07ho') 1871 self.assertRaises(AssertionError, Element, u'ha\x02ho')18721874 # ElementTree fails to serialize this 1875 tostring = self.etree.tostring 1876 Element = self.etree.Element 1877 SubElement = self.etree.SubElement 1878 1879 a = Element('a') 1880 b = SubElement(a, 'b') 1881 c = SubElement(a, 'c') 1882 1883 result = unicode(tostring(a, encoding='UTF-16'), 'UTF-16') 1884 self.assertEquals('<a><b></b><c></c></a>', 1885 canonicalize(result))18861888 # ElementTree raises an AssertionError here 1889 tostring = self.etree.tostring 1890 self.assertRaises(TypeError, self.etree.tostring, None)18911893 tostring = self.etree.tostring 1894 Element = self.etree.Element 1895 SubElement = self.etree.SubElement 1896 1897 a = Element('a') 1898 b = SubElement(a, 'b') 1899 c = SubElement(a, 'c') 1900 1901 result = tostring(a) 1902 self.assertEquals(result, "<a><b/><c/></a>") 1903 1904 result = tostring(a, pretty_print=False) 1905 self.assertEquals(result, "<a><b/><c/></a>") 1906 1907 result = tostring(a, pretty_print=True) 1908 self.assertEquals(result, "<a>\n <b/>\n <c/>\n</a>")19091911 tostring = self.etree.tostring 1912 Element = self.etree.Element 1913 SubElement = self.etree.SubElement 1914 1915 a = Element('a') 1916 a.text = "A" 1917 a.tail = "tail" 1918 b = SubElement(a, 'b') 1919 b.text = "B" 1920 b.tail = u"Søk på nettet" 1921 c = SubElement(a, 'c') 1922 c.text = "C" 1923 1924 result = tostring(a, method="text", encoding="UTF-16") 1925 1926 self.assertEquals(u'ABSøk på nettetCtail'.encode("UTF-16"), 1927 result)19281930 tounicode = self.etree.tounicode 1931 Element = self.etree.Element 1932 SubElement = self.etree.SubElement 1933 1934 a = Element('a') 1935 b = SubElement(a, 'b') 1936 c = SubElement(a, 'c') 1937 1938 self.assert_(isinstance(tounicode(a), unicode)) 1939 self.assertEquals('<a><b></b><c></c></a>', 1940 canonicalize(tounicode(a)))19411943 tounicode = self.etree.tounicode 1944 Element = self.etree.Element 1945 SubElement = self.etree.SubElement 1946 1947 a = Element('a') 1948 b = SubElement(a, 'b') 1949 c = SubElement(a, 'c') 1950 d = SubElement(c, 'd') 1951 self.assert_(isinstance(tounicode(b), unicode)) 1952 self.assert_(isinstance(tounicode(c), unicode)) 1953 self.assertEquals('<b></b>', 1954 canonicalize(tounicode(b))) 1955 self.assertEquals('<c><d></d></c>', 1956 canonicalize(tounicode(c)))1957 19611963 tounicode = self.etree.tounicode 1964 Element = self.etree.Element 1965 SubElement = self.etree.SubElement 1966 1967 a = Element('a') 1968 b = SubElement(a, 'b') 1969 c = SubElement(a, 'c') 1970 d = SubElement(c, 'd') 1971 b.tail = 'Foo' 1972 1973 self.assert_(isinstance(tounicode(b), unicode)) 1974 self.assert_(tounicode(b) == '<b/>Foo' or 1975 tounicode(b) == '<b />Foo')19761978 tounicode = self.etree.tounicode 1979 Element = self.etree.Element 1980 SubElement = self.etree.SubElement 1981 1982 a = Element('a') 1983 b = SubElement(a, 'b') 1984 c = SubElement(a, 'c') 1985 1986 result = tounicode(a) 1987 self.assertEquals(result, "<a><b/><c/></a>") 1988 1989 result = tounicode(a, pretty_print=False) 1990 self.assertEquals(result, "<a><b/><c/></a>") 1991 1992 result = tounicode(a, pretty_print=True) 1993 self.assertEquals(result, "<a>\n <b/>\n <c/>\n</a>")19941996 """Write out element for comparison. 1997 """ 1998 ElementTree = self.etree.ElementTree 1999 f = StringIO() 2000 tree = ElementTree(element=element) 2001 tree.write(f, encoding=encoding) 2002 data = f.getvalue() 2003 return canonicalize(data)2004 20052033 2037 2038 2043 20442008 filename = fileInTestDir('test_broken.xml') 2009 root = etree.XML('''\ 2010 <doc xmlns:xi="http://www.w3.org/2001/XInclude"> 2011 <xi:include href="%s" parse="text"/> 2012 </doc> 2013 ''' % filename) 2014 old_text = root.text 2015 content = open(filename).read() 2016 old_tail = root[0].tail 2017 2018 self.include( etree.ElementTree(root) ) 2019 self.assertEquals(old_text + content + old_tail, 2020 root.text)20212023 tree = etree.parse(fileInTestDir('include/test_xinclude.xml')) 2024 self.assertNotEquals( 2025 'a', 2026 tree.getroot()[1].tag) 2027 # process xincludes 2028 self.include( tree ) 2029 # check whether we find it replaced with included data 2030 self.assertEquals( 2031 'a', 2032 tree.getroot()[1].tag)20532047 tree = self.parse('<a><b/></a>') 2048 f = StringIO() 2049 tree.write_c14n(f) 2050 s = f.getvalue() 2051 self.assertEquals('<a><b></b></a>', 2052 s)2055 suite = unittest.TestSuite() 2056 suite.addTests([unittest.makeSuite(ETreeOnlyTestCase)]) 2057 suite.addTests([unittest.makeSuite(ETreeXIncludeTestCase)]) 2058 suite.addTests([unittest.makeSuite(ElementIncludeTestCase)]) 2059 suite.addTests([unittest.makeSuite(ETreeC14NTestCase)]) 2060 suite.addTests( 2061 [doctest.DocFileSuite('../../../doc/tutorial.txt')]) 2062 suite.addTests( 2063 [doctest.DocFileSuite('../../../doc/api.txt')]) 2064 suite.addTests( 2065 [doctest.DocFileSuite('../../../doc/parsing.txt')]) 2066 suite.addTests( 2067 [doctest.DocFileSuite('../../../doc/resolvers.txt')]) 2068 return suite2069 2070 if __name__ == '__main__': 2071 print 'to test use test.py %s' % __file__ 2072
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0beta1 on Sun Nov 25 11:48:42 2007 | http://epydoc.sourceforge.net |