1
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
31 seq = list(seq)
32 seq.sort()
33 return seq
34
36 """Tests only for etree, not ElementTree"""
37 etree = etree
38
49
58
65
67 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}')
74
82
84 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')
94
96 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 ')
103
111
119
121 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')
130
139
141 QName = self.etree.QName
142 self.assertRaises(ValueError, QName, '')
143 self.assertRaises(ValueError, QName, 'test', '')
144
146 QName = self.etree.QName
147 self.assertRaises(ValueError, QName, 'p:name')
148 self.assertRaises(ValueError, QName, 'test', 'p:name')
149
151 QName = self.etree.QName
152 self.assertRaises(ValueError, QName, ' name ')
153 self.assertRaises(ValueError, QName, 'na me')
154 self.assertRaises(ValueError, QName, 'test', ' name')
155
157
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)
164
170
178
192
194 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'])
199
201 root = self.etree.XML('<doc one="One" two="Two"/>')
202 self.assertEquals('Three', root.attrib.pop('three', 'Three'))
203
207
209 root = self.etree.XML('<doc one="One" two="Two"/>')
210 self.assertRaises(TypeError, root.attrib.pop, 'One', None, None)
211
213
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')
222
224 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 ")
228
230
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)
239
251
261
263
264 parse = self.etree.parse
265
266 f = StringIO('<a><b></c></b></a>')
267 self.assertRaises(SyntaxError, parse, f)
268 f.close()
269
281
300
305
307 parse = self.etree.parse
308
309 f = StringIO('<a><b></c></b></a>')
310 self.etree.clearErrorLog()
311 try:
312 parse(f)
313 logs = None
314 except SyntaxError, e:
315 logs = e.error_log
316 f.close()
317 self.assert_([ log for log in logs
318 if 'mismatch' in log.message ])
319 self.assert_([ log for log in logs
320 if 'PARSER' in log.domain_name])
321 self.assert_([ log for log in logs
322 if 'TAG_NAME_MISMATCH' in log.type_name ])
323 self.assert_([ log for log in logs
324 if 1 == log.line ])
325 self.assert_([ log for log in logs
326 if 15 == log.column ])
327
334
347
358
364
366 iterparse = self.etree.iterparse
367 f = StringIO("""
368 <a> \n \n <b> b test </b> \n
369
370 \n\t <c> \n </c> </a> \n """)
371 iterator = iterparse(f, remove_blank_text=True)
372 text = [ (element.text, element.tail)
373 for event, element in iterator ]
374 self.assertEquals(
375 [(" b test ", None), (" \n ", None), (None, None)],
376 text)
377
379 iterparse = self.etree.iterparse
380 f = StringIO('<a><b><d/></b><c/></a>')
381
382 iterator = iterparse(f, tag="b", events=('start', 'end'))
383 events = list(iterator)
384 root = iterator.root
385 self.assertEquals(
386 [('start', root[0]), ('end', root[0])],
387 events)
388
390 iterparse = self.etree.iterparse
391 f = StringIO('<a><b><d/></b><c/></a>')
392
393 iterator = iterparse(f, tag="*", events=('start', 'end'))
394 events = list(iterator)
395 self.assertEquals(
396 8,
397 len(events))
398
400 text = u'Søk på nettet'
401 wrong_declaration = "<?xml version='1.0' encoding='UTF-8'?>"
402 xml_latin1 = (u'%s<a>%s</a>' % (wrong_declaration, text)
403 ).encode('iso-8859-1')
404
405 self.assertRaises(self.etree.ParseError,
406 list, self.etree.iterparse(StringIO(xml_latin1)))
407
408 iterator = self.etree.iterparse(StringIO(xml_latin1),
409 encoding="iso-8859-1")
410 self.assertEquals(1, len(list(iterator)))
411
412 a = iterator.root
413 self.assertEquals(a.text, text)
414
418
428
438
447
457
459 iterwalk = self.etree.iterwalk
460 root = self.etree.XML('<a><b></b><c/></a>')
461
462 iterator = iterwalk(root, events=('start','end'))
463 events = list(iterator)
464 self.assertEquals(
465 [('start', root), ('start', root[0]), ('end', root[0]),
466 ('start', root[1]), ('end', root[1]), ('end', root)],
467 events)
468
479
481 iterwalk = self.etree.iterwalk
482 root = self.etree.XML('<a xmlns="ns1"><b><c xmlns="ns2"/></b></a>')
483
484 attr_name = '{testns}bla'
485 events = []
486 iterator = iterwalk(root, events=('start','end','start-ns','end-ns'))
487 for event, elem in iterator:
488 events.append(event)
489 if event == 'start':
490 if elem.tag != '{ns1}a':
491 elem.set(attr_name, 'value')
492
493 self.assertEquals(
494 ['start-ns', 'start', 'start', 'start-ns', 'start',
495 'end', 'end-ns', 'end', 'end', 'end-ns'],
496 events)
497
498 self.assertEquals(
499 None,
500 root.get(attr_name))
501 self.assertEquals(
502 'value',
503 root[0].get(attr_name))
504
506 iterwalk = self.etree.iterwalk
507 root = self.etree.XML('<a><b><d/></b><c/></a>')
508
509 counts = []
510 for event, elem in iterwalk(root):
511 counts.append(len(list(elem.getiterator())))
512 self.assertEquals(
513 [1,2,1,4],
514 counts)
515
517 parse = self.etree.parse
518 parser = self.etree.XMLParser(dtd_validation=True)
519 assertEqual = self.assertEqual
520 test_url = u"__nosuch.dtd"
521
522 class MyResolver(self.etree.Resolver):
523 def resolve(self, url, id, context):
524 assertEqual(url, test_url)
525 return self.resolve_string(
526 u'''<!ENTITY myentity "%s">
527 <!ELEMENT doc ANY>''' % url, context)
528
529 parser.resolvers.add(MyResolver())
530
531 xml = u'<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>' % test_url
532 tree = parse(StringIO(xml), parser)
533 root = tree.getroot()
534 self.assertEquals(root.text, test_url)
535
537 parse = self.etree.parse
538 parser = self.etree.XMLParser(attribute_defaults=True)
539 assertEqual = self.assertEqual
540 test_url = u"__nosuch.dtd"
541
542 class MyResolver(self.etree.Resolver):
543 def resolve(self, url, id, context):
544 assertEqual(url, test_url)
545 return self.resolve_filename(
546 fileInTestDir('test.dtd'), context)
547
548 parser.resolvers.add(MyResolver())
549
550 xml = u'<!DOCTYPE a SYSTEM "%s"><a><b/></a>' % test_url
551 tree = parse(StringIO(xml), parser)
552 root = tree.getroot()
553 self.assertEquals(
554 root.attrib, {'default': 'valueA'})
555 self.assertEquals(
556 root[0].attrib, {'default': 'valueB'})
557
559 parse = self.etree.parse
560 parser = self.etree.XMLParser(load_dtd=True)
561 assertEqual = self.assertEqual
562 test_url = u"__nosuch.dtd"
563
564 class check(object):
565 resolved = False
566
567 class MyResolver(self.etree.Resolver):
568 def resolve(self, url, id, context):
569 assertEqual(url, test_url)
570 check.resolved = True
571 return self.resolve_empty(context)
572
573 parser.resolvers.add(MyResolver())
574
575 xml = u'<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>' % test_url
576 self.assertRaises(etree.XMLSyntaxError, parse, StringIO(xml), parser)
577 self.assert_(check.resolved)
578
586
587 class MyResolver(self.etree.Resolver):
588 def resolve(self, url, id, context):
589 raise _LocalException
590
591 parser.resolvers.add(MyResolver())
592
593 xml = u'<!DOCTYPE doc SYSTEM "test"><doc>&myentity;</doc>'
594 self.assertRaises(_LocalException, parse, StringIO(xml), parser)
595
596 if etree.LIBXML_VERSION > (2,6,20):
613
629
636
638 Entity = self.etree.Entity
639 self.assertRaises(ValueError, Entity, 'a b c')
640 self.assertRaises(ValueError, Entity, 'a,b')
641 self.assertRaises(AssertionError, Entity, 'a\0b')
642 self.assertRaises(ValueError, Entity, '#abc')
643 self.assertRaises(ValueError, Entity, '#xxyz')
644
645
655
660
673
686
692
698
713
715 Element = self.etree.Element
716 PI = self.etree.PI
717 root = Element('root')
718 pi = PI('TARGET', 'TEXT')
719 pi.tail = "TAIL"
720
721 self.assertEquals('<root></root>',
722 self._writeElement(root))
723 root.addprevious(pi)
724 self.assertEquals('<?TARGET TEXT?>\n<root></root>',
725 self._writeElement(root))
726
741
754
769
782
797
810
811
813 XML = self.etree.XML
814
815 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
816 values = root.values()
817 values.sort()
818 self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)
819
820
830
831
846
847
857
858
874
875
886
887
898
899
904
905
907 self.assertRaises(TypeError, etree.dump, None)
908
910 ElementTree = self.etree.ElementTree
911
912 f = StringIO('<a xmlns:foo="http://www.infrae.com/ns/1"><foo:b/></a>')
913 doc = ElementTree(file=f)
914 a = doc.getroot()
915 self.assertEquals(
916 None,
917 a.prefix)
918 self.assertEquals(
919 'foo',
920 a[0].prefix)
921
923 ElementTree = self.etree.ElementTree
924
925 f = StringIO('<a xmlns="http://www.infrae.com/ns/1"><b/></a>')
926 doc = ElementTree(file=f)
927 a = doc.getroot()
928 self.assertEquals(
929 None,
930 a.prefix)
931 self.assertEquals(
932 None,
933 a[0].prefix)
934
955
957 XML = self.etree.XML
958
959 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
960 result = []
961 for el in root.iterchildren():
962 result.append(el.tag)
963 self.assertEquals(['one', 'two', 'three'], result)
964
966 XML = self.etree.XML
967
968 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
969 result = []
970 for el in root.iterchildren(reversed=True):
971 result.append(el.tag)
972 self.assertEquals(['three', 'two', 'one'], result)
973
975 XML = self.etree.XML
976
977 root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>')
978 result = []
979 for el in root.iterchildren(tag='two'):
980 result.append(el.text)
981 self.assertEquals(['Two', 'Bla'], result)
982
984 XML = self.etree.XML
985
986 root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>')
987 result = []
988 for el in root.iterchildren(reversed=True, tag='two'):
989 result.append(el.text)
990 self.assertEquals(['Bla', 'Two'], result)
991
993 Element = self.etree.Element
994 SubElement = self.etree.SubElement
995
996 a = Element('a')
997 b = SubElement(a, 'b')
998 c = SubElement(a, 'c')
999 d = SubElement(b, 'd')
1000 self.assertEquals(
1001 [],
1002 list(a.iterancestors()))
1003 self.assertEquals(
1004 [a],
1005 list(b.iterancestors()))
1006 self.assertEquals(
1007 a,
1008 c.iterancestors().next())
1009 self.assertEquals(
1010 [b, a],
1011 list(d.iterancestors()))
1012
1024
1041
1062
1080
1097
1115
1117 Element = self.etree.Element
1118 SubElement = self.etree.SubElement
1119
1120 a = Element('a')
1121 b = SubElement(a, 'b')
1122 c = SubElement(a, 'c')
1123 d = SubElement(b, 'd')
1124 self.assertEquals(
1125 [],
1126 list(a.itersiblings()))
1127 self.assertEquals(
1128 [c],
1129 list(b.itersiblings()))
1130 self.assertEquals(
1131 c,
1132 b.itersiblings().next())
1133 self.assertEquals(
1134 [],
1135 list(c.itersiblings()))
1136 self.assertEquals(
1137 [b],
1138 list(c.itersiblings(preceding=True)))
1139 self.assertEquals(
1140 [],
1141 list(b.itersiblings(preceding=True)))
1142
1144 Element = self.etree.Element
1145 SubElement = self.etree.SubElement
1146
1147 a = Element('a')
1148 b = SubElement(a, 'b')
1149 c = SubElement(a, 'c')
1150 d = SubElement(b, 'd')
1151 self.assertEquals(
1152 [],
1153 list(a.itersiblings(tag='XXX')))
1154 self.assertEquals(
1155 [c],
1156 list(b.itersiblings(tag='c')))
1157 self.assertEquals(
1158 [b],
1159 list(c.itersiblings(preceding=True, tag='b')))
1160 self.assertEquals(
1161 [],
1162 list(c.itersiblings(preceding=True, tag='c')))
1163
1165 parseid = self.etree.parseid
1166 XML = self.etree.XML
1167 xml_text = '''
1168 <!DOCTYPE document [
1169 <!ELEMENT document (h1,p)*>
1170 <!ELEMENT h1 (#PCDATA)>
1171 <!ATTLIST h1 myid ID #REQUIRED>
1172 <!ELEMENT p (#PCDATA)>
1173 <!ATTLIST p someid ID #REQUIRED>
1174 ]>
1175 <document>
1176 <h1 myid="chapter1">...</h1>
1177 <p id="note1" class="note">...</p>
1178 <p>Regular paragraph.</p>
1179 <p xml:id="xmlid">XML:ID paragraph.</p>
1180 <p someid="warn1" class="warning">...</p>
1181 </document>
1182 '''
1183
1184 tree, dic = parseid(StringIO(xml_text))
1185 root = tree.getroot()
1186 root2 = XML(xml_text)
1187 self.assertEquals(self._writeElement(root),
1188 self._writeElement(root2))
1189 expected = {
1190 "chapter1" : root[0],
1191 "xmlid" : root[3],
1192 "warn1" : root[4]
1193 }
1194 self.assert_("chapter1" in dic)
1195 self.assert_("warn1" in dic)
1196 self.assert_("xmlid" in dic)
1197 self._checkIDDict(dic, expected)
1198
1200 XMLDTDID = self.etree.XMLDTDID
1201 XML = self.etree.XML
1202 xml_text = '''
1203 <!DOCTYPE document [
1204 <!ELEMENT document (h1,p)*>
1205 <!ELEMENT h1 (#PCDATA)>
1206 <!ATTLIST h1 myid ID #REQUIRED>
1207 <!ELEMENT p (#PCDATA)>
1208 <!ATTLIST p someid ID #REQUIRED>
1209 ]>
1210 <document>
1211 <h1 myid="chapter1">...</h1>
1212 <p id="note1" class="note">...</p>
1213 <p>Regular paragraph.</p>
1214 <p xml:id="xmlid">XML:ID paragraph.</p>
1215 <p someid="warn1" class="warning">...</p>
1216 </document>
1217 '''
1218
1219 root, dic = XMLDTDID(xml_text)
1220 root2 = XML(xml_text)
1221 self.assertEquals(self._writeElement(root),
1222 self._writeElement(root2))
1223 expected = {
1224 "chapter1" : root[0],
1225 "xmlid" : root[3],
1226 "warn1" : root[4]
1227 }
1228 self.assert_("chapter1" in dic)
1229 self.assert_("warn1" in dic)
1230 self.assert_("xmlid" in dic)
1231 self._checkIDDict(dic, expected)
1232
1234 XMLDTDID = self.etree.XMLDTDID
1235 XML = self.etree.XML
1236 xml_text = '''
1237 <document>
1238 <h1 myid="chapter1">...</h1>
1239 <p id="note1" class="note">...</p>
1240 <p>Regular paragraph.</p>
1241 <p someid="warn1" class="warning">...</p>
1242 </document>
1243 '''
1244
1245 root, dic = XMLDTDID(xml_text)
1246 root2 = XML(xml_text)
1247 self.assertEquals(self._writeElement(root),
1248 self._writeElement(root2))
1249 expected = {}
1250 self._checkIDDict(dic, expected)
1251
1253 self.assertEquals(dic, expected)
1254 self.assertEquals(len(dic),
1255 len(expected))
1256 self.assertEquals(sorted(dic.items()),
1257 sorted(expected.items()))
1258 self.assertEquals(sorted(dic.iteritems()),
1259 sorted(expected.iteritems()))
1260 self.assertEquals(sorted(dic.keys()),
1261 sorted(expected.keys()))
1262 self.assertEquals(sorted(dic.iterkeys()),
1263 sorted(expected.iterkeys()))
1264 self.assertEquals(sorted(dic.values()),
1265 sorted(expected.values()))
1266 self.assertEquals(sorted(dic.itervalues()),
1267 sorted(expected.itervalues()))
1268
1270 etree = self.etree
1271
1272 r = {'foo': 'http://ns.infrae.com/foo'}
1273 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1274 self.assertEquals(
1275 'foo',
1276 e.prefix)
1277 self.assertEquals(
1278 '<foo:bar xmlns:foo="http://ns.infrae.com/foo"></foo:bar>',
1279 self._writeElement(e))
1280
1282 etree = self.etree
1283
1284 r = {None: 'http://ns.infrae.com/foo'}
1285 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1286 self.assertEquals(
1287 None,
1288 e.prefix)
1289 self.assertEquals(
1290 '{http://ns.infrae.com/foo}bar',
1291 e.tag)
1292 self.assertEquals(
1293 '<bar xmlns="http://ns.infrae.com/foo"></bar>',
1294 self._writeElement(e))
1295
1297 etree = self.etree
1298
1299 r = {None: 'http://ns.infrae.com/foo',
1300 'hoi': 'http://ns.infrae.com/hoi'}
1301 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1302 e.set('{http://ns.infrae.com/hoi}test', 'value')
1303 self.assertEquals(
1304 '<bar xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi" hoi:test="value"></bar>',
1305 self._writeElement(e))
1306
1308 etree = self.etree
1309 r = {None: 'http://ns.infrae.com/foo',
1310 'hoi': 'http://ns.infrae.com/hoi'}
1311 e = etree.Element('{http://ns.infrae.com/foo}z', nsmap=r)
1312 tree = etree.ElementTree(element=e)
1313 etree.SubElement(e, '{http://ns.infrae.com/hoi}x')
1314 self.assertEquals(
1315 '<z xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi"><hoi:x></hoi:x></z>',
1316 self._writeElement(e))
1317
1319 etree = self.etree
1320
1321 r = {None: 'http://ns.infrae.com/foo'}
1322 e1 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1323 e2 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1324
1325 e1.append(e2)
1326
1327 self.assertEquals(
1328 None,
1329 e1.prefix)
1330 self.assertEquals(
1331 None,
1332 e1[0].prefix)
1333 self.assertEquals(
1334 '{http://ns.infrae.com/foo}bar',
1335 e1.tag)
1336 self.assertEquals(
1337 '{http://ns.infrae.com/foo}bar',
1338 e1[0].tag)
1339
1341 etree = self.etree
1342
1343 r = {None: 'http://ns.infrae.com/BAR'}
1344 e1 = etree.Element('{http://ns.infrae.com/BAR}bar', nsmap=r)
1345 e2 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1346
1347 e1.append(e2)
1348
1349 self.assertEquals(
1350 None,
1351 e1.prefix)
1352 self.assertNotEquals(
1353 None,
1354 e2.prefix)
1355 self.assertEquals(
1356 '{http://ns.infrae.com/BAR}bar',
1357 e1.tag)
1358 self.assertEquals(
1359 '{http://ns.infrae.com/foo}bar',
1360 e2.tag)
1361
1363 ns_href = "http://a.b.c"
1364 one = self.etree.fromstring(
1365 '<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href)
1366 baz = one[0][0]
1367
1368 two = self.etree.fromstring(
1369 '<root xmlns:ns="%s"/>' % ns_href)
1370 two.append(baz)
1371 del one
1372
1373 self.assertEquals('{%s}baz' % ns_href, baz.tag)
1374 self.assertEquals(
1375 '<root xmlns:ns="%s"><ns:baz/></root>' % ns_href,
1376 self.etree.tostring(two))
1377
1379 parse = self.etree.parse
1380 tostring = self.etree.tostring
1381
1382 ns_href = "http://a.b.c"
1383 one = parse(
1384 StringIO('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href))
1385 baz = one.getroot()[0][0]
1386
1387 parsed = parse(StringIO( tostring(baz) )).getroot()
1388 self.assertEquals('{%s}baz' % ns_href, parsed.tag)
1389
1391 etree = self.etree
1392
1393 r = {None: 'http://ns.infrae.com/foo',
1394 'hoi': 'http://ns.infrae.com/hoi'}
1395 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1396 self.assertEquals(
1397 r,
1398 e.nsmap)
1399
1401 etree = self.etree
1402
1403 re = {None: 'http://ns.infrae.com/foo',
1404 'hoi': 'http://ns.infrae.com/hoi'}
1405 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=re)
1406
1407 rs = {None: 'http://ns.infrae.com/honk',
1408 'top': 'http://ns.infrae.com/top'}
1409 s = etree.SubElement(e, '{http://ns.infrae.com/honk}bar', nsmap=rs)
1410
1411 r = re.copy()
1412 r.update(rs)
1413 self.assertEquals(
1414 re,
1415 e.nsmap)
1416 self.assertEquals(
1417 r,
1418 s.nsmap)
1419
1421 Element = self.etree.Element
1422 SubElement = self.etree.SubElement
1423
1424 a = Element('{a}a')
1425 b = SubElement(a, '{a}b')
1426 c = SubElement(a, '{a}c')
1427 d = SubElement(b, '{b}d')
1428 e = SubElement(c, '{a}e')
1429 f = SubElement(c, '{b}f')
1430
1431 self.assertEquals(
1432 [a],
1433 list(a.getiterator('{a}a')))
1434 self.assertEquals(
1435 [],
1436 list(a.getiterator('{b}a')))
1437 self.assertEquals(
1438 [],
1439 list(a.getiterator('a')))
1440 self.assertEquals(
1441 [f],
1442 list(c.getiterator('{b}*')))
1443 self.assertEquals(
1444 [d, f],
1445 list(a.getiterator('{b}*')))
1446
1471
1487
1504
1505 - def test_itertext(self):
1506
1507 XML = self.etree.XML
1508 root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")
1509
1510 text = list(root.itertext())
1511 self.assertEquals(["RTEXT", "ATAIL", "CTEXT", "CTAIL"],
1512 text)
1513
1515
1516 XML = self.etree.XML
1517 root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")
1518
1519 text = list(root[2].itertext())
1520 self.assertEquals(["CTEXT"],
1521 text)
1522
1529
1536
1545
1547 XML = self.etree.XML
1548 root = XML('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')
1549 self.assertEquals(len(root.findall(".//{X}b")), 2)
1550 self.assertEquals(len(root.findall(".//{X}*")), 2)
1551 self.assertEquals(len(root.findall(".//b")), 3)
1552
1554 etree = self.etree
1555 e = etree.Element('foo')
1556 for i in range(10):
1557 etree.SubElement(e, 'a%s' % i)
1558 for i in range(10):
1559 self.assertEquals(
1560 i,
1561 e.index(e[i]))
1562 self.assertEquals(
1563 3, e.index(e[3], 3))
1564 self.assertRaises(
1565 ValueError, e.index, e[3], 4)
1566 self.assertRaises(
1567 ValueError, e.index, e[3], 0, 2)
1568 self.assertRaises(
1569 ValueError, e.index, e[8], 0, -3)
1570 self.assertRaises(
1571 ValueError, e.index, e[8], -5, -3)
1572 self.assertEquals(
1573 8, e.index(e[8], 0, -1))
1574 self.assertEquals(
1575 8, e.index(e[8], -12, -1))
1576 self.assertEquals(
1577 0, e.index(e[0], -12, -1))
1578
1580 etree = self.etree
1581 e = etree.Element('foo')
1582 for i in range(10):
1583 el = etree.SubElement(e, 'a%s' % i)
1584 el.text = "text%d" % i
1585 el.tail = "tail%d" % i
1586
1587 child0 = e[0]
1588 child1 = e[1]
1589 child2 = e[2]
1590
1591 e.replace(e[0], e[1])
1592 self.assertEquals(
1593 9, len(e))
1594 self.assertEquals(
1595 child1, e[0])
1596 self.assertEquals(
1597 child1.text, "text1")
1598 self.assertEquals(
1599 child1.tail, "tail1")
1600 self.assertEquals(
1601 child0.tail, "tail0")
1602 self.assertEquals(
1603 child2, e[1])
1604
1605 e.replace(e[-1], e[0])
1606 self.assertEquals(
1607 child1, e[-1])
1608 self.assertEquals(
1609 child1.text, "text1")
1610 self.assertEquals(
1611 child1.tail, "tail1")
1612 self.assertEquals(
1613 child2, e[0])
1614
1616 etree = self.etree
1617 e = etree.Element('foo')
1618 for i in range(10):
1619 etree.SubElement(e, 'a%s' % i)
1620
1621 new_element = etree.Element("test")
1622 new_element.text = "TESTTEXT"
1623 new_element.tail = "TESTTAIL"
1624 child1 = e[1]
1625 e.replace(e[0], new_element)
1626 self.assertEquals(
1627 new_element, e[0])
1628 self.assertEquals(
1629 "TESTTEXT",
1630 e[0].text)
1631 self.assertEquals(
1632 "TESTTAIL",
1633 e[0].tail)
1634 self.assertEquals(
1635 child1, e[1])
1636
1652
1670
1688
1706
1708 Element = self.etree.Element
1709 SubElement = self.etree.SubElement
1710 try:
1711 slice
1712 except NameError:
1713 print "slice() not found"
1714 return
1715
1716 a = Element('a')
1717 b = SubElement(a, 'b')
1718 c = SubElement(a, 'c')
1719 d = SubElement(a, 'd')
1720 e = SubElement(a, 'e')
1721
1722 x = Element('x')
1723 y = Element('y')
1724 z = Element('z')
1725
1726 self.assertRaises(
1727 ValueError,
1728 operator.setitem, a, slice(1,None,2), [x, y, z])
1729
1730 self.assertEquals(
1731 [b, c, d, e],
1732 list(a))
1733
1735 etree = self.etree
1736 root = etree.Element('foo')
1737 for i in range(3):
1738 element = etree.SubElement(root, 'a%s' % i)
1739 element.text = "text%d" % i
1740 element.tail = "tail%d" % i
1741
1742 elements = []
1743 for i in range(3):
1744 new_element = etree.Element("test%s" % i)
1745 new_element.text = "TEXT%s" % i
1746 new_element.tail = "TAIL%s" % i
1747 elements.append(new_element)
1748
1749 root.extend(elements)
1750
1751 self.assertEquals(
1752 ["a0", "a1", "a2", "test0", "test1", "test2"],
1753 [ el.tag for el in root ])
1754 self.assertEquals(
1755 ["text0", "text1", "text2", "TEXT0", "TEXT1", "TEXT2"],
1756 [ el.text for el in root ])
1757 self.assertEquals(
1758 ["tail0", "tail1", "tail2", "TAIL0", "TAIL1", "TAIL2"],
1759 [ el.tail for el in root ])
1760
1762 XML = self.etree.XML
1763 root = XML('''<?xml version="1.0"?>
1764 <root><test>
1765
1766 <bla/></test>
1767 </root>
1768 ''')
1769
1770 self.assertEquals(
1771 [2, 2, 4],
1772 [ el.sourceline for el in root.getiterator() ])
1773
1775 parse = self.etree.parse
1776 tree = parse(fileInTestDir('include/test_xinclude.xml'))
1777
1778 self.assertEquals(
1779 [1, 2, 3],
1780 [ el.sourceline for el in tree.getiterator() ])
1781
1790
1792 iterparse = self.etree.iterparse
1793 lines = [ el.sourceline for (event, el) in
1794 iterparse(fileInTestDir('include/test_xinclude.xml'),
1795 events=("start",)) ]
1796
1797 self.assertEquals(
1798 [1, 2, 3],
1799 lines)
1800
1810
1812 etree = self.etree
1813 root = etree.XML("<root/>", base_url="http://no/such/url")
1814 docinfo = root.getroottree().docinfo
1815 self.assertEquals(docinfo.URL, "http://no/such/url")
1816
1818 etree = self.etree
1819 tree = etree.parse(StringIO("<root/>"), base_url="http://no/such/url")
1820 docinfo = tree.docinfo
1821 self.assertEquals(docinfo.URL, "http://no/such/url")
1822
1824 etree = self.etree
1825 tree = etree.parse(fileInTestDir('include/test_xinclude.xml'),
1826 base_url="http://no/such/url")
1827 docinfo = tree.docinfo
1828 self.assertEquals(docinfo.URL, "http://no/such/url")
1829
1831 etree = self.etree
1832 root = etree.HTML("<html/>", base_url="http://no/such/url")
1833 docinfo = root.getroottree().docinfo
1834 self.assertEquals(docinfo.URL, "http://no/such/url")
1835
1837 etree = self.etree
1838 xml_header = '<?xml version="1.0" encoding="ascii"?>'
1839 pub_id = "-//W3C//DTD XHTML 1.0 Transitional//EN"
1840 sys_id = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
1841 doctype_string = '<!DOCTYPE html PUBLIC "%s" "%s">' % (pub_id, sys_id)
1842
1843 xml = xml_header + doctype_string + '<html><body></body></html>'
1844
1845 tree = etree.parse(StringIO(xml))
1846 docinfo = tree.docinfo
1847 self.assertEquals(docinfo.encoding, "ascii")
1848 self.assertEquals(docinfo.xml_version, "1.0")
1849 self.assertEquals(docinfo.public_id, pub_id)
1850 self.assertEquals(docinfo.system_url, sys_id)
1851 self.assertEquals(docinfo.root_name, 'html')
1852 self.assertEquals(docinfo.doctype, doctype_string)
1853
1855 etree = self.etree
1856 xml_header = '<?xml version="1.0" encoding="UTF-8"?>'
1857 sys_id = "some.dtd"
1858 doctype_string = '<!DOCTYPE html SYSTEM "%s">' % sys_id
1859 xml = xml_header + doctype_string + '<html><body></body></html>'
1860
1861 tree = etree.parse(StringIO(xml))
1862 docinfo = tree.docinfo
1863 self.assertEquals(docinfo.encoding, "UTF-8")
1864 self.assertEquals(docinfo.xml_version, "1.0")
1865 self.assertEquals(docinfo.public_id, None)
1866 self.assertEquals(docinfo.system_url, sys_id)
1867 self.assertEquals(docinfo.root_name, 'html')
1868 self.assertEquals(docinfo.doctype, doctype_string)
1869
1871 etree = self.etree
1872 xml = '<html><body></body></html>'
1873 tree = etree.parse(StringIO(xml))
1874 docinfo = tree.docinfo
1875 self.assertEquals(docinfo.encoding, None)
1876 self.assertEquals(docinfo.xml_version, "1.0")
1877 self.assertEquals(docinfo.public_id, None)
1878 self.assertEquals(docinfo.system_url, None)
1879 self.assertEquals(docinfo.root_name, 'html')
1880 self.assertEquals(docinfo.doctype, '')
1881
1883
1884 xml = '''\
1885 <!DOCTYPE test SYSTEM "test.dtd" [
1886 <!ENTITY entity "tasty">
1887 <!ELEMENT test (a)>
1888 <!ELEMENT a (#PCDATA)>
1889 ]>
1890 <test><a>test-test</a></test>\
1891 '''
1892 tree = self.etree.parse(StringIO(xml))
1893 self.assertEqual(self.etree.tostring(tree).replace(" ", ""),
1894 xml.replace(" ", ""))
1895
1897 Element = self.etree.Element
1898
1899 a = Element('a')
1900 self.assertRaises(AssertionError, setattr, a, "text", 'ha\0ho')
1901 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\0ho')
1902
1903 self.assertRaises(AssertionError, Element, 'ha\0ho')
1904
1906 Element = self.etree.Element
1907
1908 a = Element('a')
1909 self.assertRaises(AssertionError, setattr, a, "text", u'ha\0ho')
1910 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\0ho')
1911
1912 self.assertRaises(AssertionError, Element, u'ha\0ho')
1913
1915 Element = self.etree.Element
1916
1917 a = Element('a')
1918 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x07ho')
1919 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x02ho')
1920
1921 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x07ho')
1922 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x02ho')
1923
1924 self.assertRaises(AssertionError, Element, 'ha\x07ho')
1925 self.assertRaises(AssertionError, Element, 'ha\x02ho')
1926
1928 Element = self.etree.Element
1929
1930 a = Element('a')
1931 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x07ho')
1932 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x02ho')
1933
1934 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x07ho')
1935 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x02ho')
1936
1937 self.assertRaises(AssertionError, Element, u'ha\x07ho')
1938 self.assertRaises(AssertionError, Element, u'ha\x02ho')
1939
1953
1958
1976
1996
1998 tostring = self.etree.tostring
1999 Element = self.etree.Element
2000 SubElement = self.etree.SubElement
2001
2002 a = Element('a')
2003 a.text = "A"
2004 a.tail = "tail"
2005 b = SubElement(a, 'b')
2006 b.text = "B"
2007 b.tail = u"Søk på nettet"
2008 c = SubElement(a, 'c')
2009 c.text = "C"
2010
2011 result = tostring(a, method="text", encoding="UTF-16")
2012
2013 self.assertEquals(u'ABSøk på nettetCtail'.encode("UTF-16"),
2014 result)
2015
2028
2044
2048
2063
2081
2094
2096 tostring = self.etree.tostring
2097 Element = self.etree.Element
2098 SubElement = self.etree.SubElement
2099
2100 a = Element('a')
2101 b = SubElement(a, 'b')
2102 c = SubElement(a, 'c')
2103 d = SubElement(c, 'd')
2104 self.assert_(isinstance(tostring(b, encoding=unicode), unicode))
2105 self.assert_(isinstance(tostring(c, encoding=unicode), unicode))
2106 self.assertEquals('<b></b>',
2107 canonicalize(tostring(b, encoding=unicode)))
2108 self.assertEquals('<c><d></d></c>',
2109 canonicalize(tostring(c, encoding=unicode)))
2110
2115
2130
2132 tostring = self.etree.tostring
2133 Element = self.etree.Element
2134 SubElement = self.etree.SubElement
2135
2136 a = Element('a')
2137 b = SubElement(a, 'b')
2138 c = SubElement(a, 'c')
2139
2140 result = tostring(a, encoding=unicode)
2141 self.assertEquals(result, "<a><b/><c/></a>")
2142
2143 result = tostring(a, encoding=unicode, pretty_print=False)
2144 self.assertEquals(result, "<a><b/><c/></a>")
2145
2146 result = tostring(a, encoding=unicode, pretty_print=True)
2147 self.assertEquals(result, "<a>\n <b/>\n <c/>\n</a>\n")
2148
2149
2150
2160
2161
2164 filename = fileInTestDir('test_broken.xml')
2165 root = etree.XML('''\
2166 <doc xmlns:xi="http://www.w3.org/2001/XInclude">
2167 <xi:include href="%s" parse="text"/>
2168 </doc>
2169 ''' % filename)
2170 old_text = root.text
2171 content = open(filename).read()
2172 old_tail = root[0].tail
2173
2174 self.include( etree.ElementTree(root) )
2175 self.assertEquals(old_text + content + old_tail,
2176 root.text)
2177
2179 tree = etree.parse(fileInTestDir('include/test_xinclude.xml'))
2180 self.assertNotEquals(
2181 'a',
2182 tree.getroot()[1].tag)
2183
2184 self.include( tree )
2185
2186 self.assertEquals(
2187 'a',
2188 tree.getroot()[1].tag)
2189
2193
2194
2199
2200
2203 tree = self.parse('<a><b/></a>')
2204 f = StringIO()
2205 tree.write_c14n(f)
2206 s = f.getvalue()
2207 self.assertEquals('<a><b></b></a>',
2208 s)
2209
2211 suite = unittest.TestSuite()
2212 suite.addTests([unittest.makeSuite(ETreeOnlyTestCase)])
2213 suite.addTests([unittest.makeSuite(ETreeXIncludeTestCase)])
2214 suite.addTests([unittest.makeSuite(ElementIncludeTestCase)])
2215 suite.addTests([unittest.makeSuite(ETreeC14NTestCase)])
2216 suite.addTests(
2217 [doctest.DocFileSuite('../../../doc/tutorial.txt')])
2218 suite.addTests(
2219 [doctest.DocFileSuite('../../../doc/api.txt')])
2220 suite.addTests(
2221 [doctest.DocFileSuite('../../../doc/parsing.txt')])
2222 suite.addTests(
2223 [doctest.DocFileSuite('../../../doc/resolvers.txt')])
2224 return suite
2225
2226 if __name__ == '__main__':
2227 print 'to test use test.py %s' % __file__
2228