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(load_dtd=True)
539 assertEqual = self.assertEqual
540 test_url = u"__nosuch.dtd"
541
542 class check(object):
543 resolved = False
544
545 class MyResolver(self.etree.Resolver):
546 def resolve(self, url, id, context):
547 assertEqual(url, test_url)
548 check.resolved = True
549 return self.resolve_empty(context)
550
551 parser.resolvers.add(MyResolver())
552
553 xml = u'<!DOCTYPE doc SYSTEM "%s"><doc>&myentity;</doc>' % test_url
554 self.assertRaises(etree.XMLSyntaxError, parse, StringIO(xml), parser)
555 self.assert_(check.resolved)
556
564
565 class MyResolver(self.etree.Resolver):
566 def resolve(self, url, id, context):
567 raise _LocalException
568
569 parser.resolvers.add(MyResolver())
570
571 xml = u'<!DOCTYPE doc SYSTEM "test"><doc>&myentity;</doc>'
572 self.assertRaises(_LocalException, parse, StringIO(xml), parser)
573
574 if etree.LIBXML_VERSION > (2,6,20):
591
607
614
616 Entity = self.etree.Entity
617 self.assertRaises(ValueError, Entity, 'a b c')
618 self.assertRaises(ValueError, Entity, 'a,b')
619 self.assertRaises(AssertionError, Entity, 'a\0b')
620 self.assertRaises(ValueError, Entity, '#abc')
621 self.assertRaises(ValueError, Entity, '#xxyz')
622
623
633
638
651
664
670
676
691
693 Element = self.etree.Element
694 PI = self.etree.PI
695 root = Element('root')
696 pi = PI('TARGET', 'TEXT')
697 pi.tail = "TAIL"
698
699 self.assertEquals('<root></root>',
700 self._writeElement(root))
701 root.addprevious(pi)
702 self.assertEquals('<?TARGET TEXT?>\n<root></root>',
703 self._writeElement(root))
704
719
732
747
760
775
788
789
791 XML = self.etree.XML
792
793 root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>')
794 values = root.values()
795 values.sort()
796 self.assertEquals(['Alpha', 'Beta', 'Gamma'], values)
797
798
808
809
824
825
835
836
852
853
864
865
876
877
882
883
885 self.assertRaises(TypeError, etree.dump, None)
886
888 ElementTree = self.etree.ElementTree
889
890 f = StringIO('<a xmlns:foo="http://www.infrae.com/ns/1"><foo:b/></a>')
891 doc = ElementTree(file=f)
892 a = doc.getroot()
893 self.assertEquals(
894 None,
895 a.prefix)
896 self.assertEquals(
897 'foo',
898 a[0].prefix)
899
901 ElementTree = self.etree.ElementTree
902
903 f = StringIO('<a xmlns="http://www.infrae.com/ns/1"><b/></a>')
904 doc = ElementTree(file=f)
905 a = doc.getroot()
906 self.assertEquals(
907 None,
908 a.prefix)
909 self.assertEquals(
910 None,
911 a[0].prefix)
912
933
935 XML = self.etree.XML
936
937 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
938 result = []
939 for el in root.iterchildren():
940 result.append(el.tag)
941 self.assertEquals(['one', 'two', 'three'], result)
942
944 XML = self.etree.XML
945
946 root = XML('<doc><one/><two>Two</two>Hm<three/></doc>')
947 result = []
948 for el in root.iterchildren(reversed=True):
949 result.append(el.tag)
950 self.assertEquals(['three', 'two', 'one'], result)
951
953 XML = self.etree.XML
954
955 root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>')
956 result = []
957 for el in root.iterchildren(tag='two'):
958 result.append(el.text)
959 self.assertEquals(['Two', 'Bla'], result)
960
962 XML = self.etree.XML
963
964 root = XML('<doc><one/><two>Two</two>Hm<two>Bla</two></doc>')
965 result = []
966 for el in root.iterchildren(reversed=True, tag='two'):
967 result.append(el.text)
968 self.assertEquals(['Bla', 'Two'], result)
969
990
1002
1019
1040
1058
1075
1093
1095 Element = self.etree.Element
1096 SubElement = self.etree.SubElement
1097
1098 a = Element('a')
1099 b = SubElement(a, 'b')
1100 c = SubElement(a, 'c')
1101 d = SubElement(b, 'd')
1102 self.assertEquals(
1103 [],
1104 list(a.itersiblings()))
1105 self.assertEquals(
1106 [c],
1107 list(b.itersiblings()))
1108 self.assertEquals(
1109 c,
1110 b.itersiblings().next())
1111 self.assertEquals(
1112 [],
1113 list(c.itersiblings()))
1114 self.assertEquals(
1115 [b],
1116 list(c.itersiblings(preceding=True)))
1117 self.assertEquals(
1118 [],
1119 list(b.itersiblings(preceding=True)))
1120
1122 Element = self.etree.Element
1123 SubElement = self.etree.SubElement
1124
1125 a = Element('a')
1126 b = SubElement(a, 'b')
1127 c = SubElement(a, 'c')
1128 d = SubElement(b, 'd')
1129 self.assertEquals(
1130 [],
1131 list(a.itersiblings(tag='XXX')))
1132 self.assertEquals(
1133 [c],
1134 list(b.itersiblings(tag='c')))
1135 self.assertEquals(
1136 [b],
1137 list(c.itersiblings(preceding=True, tag='b')))
1138 self.assertEquals(
1139 [],
1140 list(c.itersiblings(preceding=True, tag='c')))
1141
1143 parseid = self.etree.parseid
1144 XML = self.etree.XML
1145 xml_text = '''
1146 <!DOCTYPE document [
1147 <!ELEMENT document (h1,p)*>
1148 <!ELEMENT h1 (#PCDATA)>
1149 <!ATTLIST h1 myid ID #REQUIRED>
1150 <!ELEMENT p (#PCDATA)>
1151 <!ATTLIST p someid ID #REQUIRED>
1152 ]>
1153 <document>
1154 <h1 myid="chapter1">...</h1>
1155 <p id="note1" class="note">...</p>
1156 <p>Regular paragraph.</p>
1157 <p xml:id="xmlid">XML:ID paragraph.</p>
1158 <p someid="warn1" class="warning">...</p>
1159 </document>
1160 '''
1161
1162 tree, dic = parseid(StringIO(xml_text))
1163 root = tree.getroot()
1164 root2 = XML(xml_text)
1165 self.assertEquals(self._writeElement(root),
1166 self._writeElement(root2))
1167 expected = {
1168 "chapter1" : root[0],
1169 "xmlid" : root[3],
1170 "warn1" : root[4]
1171 }
1172 self.assert_("chapter1" in dic)
1173 self.assert_("warn1" in dic)
1174 self.assert_("xmlid" in dic)
1175 self._checkIDDict(dic, expected)
1176
1178 XMLDTDID = self.etree.XMLDTDID
1179 XML = self.etree.XML
1180 xml_text = '''
1181 <!DOCTYPE document [
1182 <!ELEMENT document (h1,p)*>
1183 <!ELEMENT h1 (#PCDATA)>
1184 <!ATTLIST h1 myid ID #REQUIRED>
1185 <!ELEMENT p (#PCDATA)>
1186 <!ATTLIST p someid ID #REQUIRED>
1187 ]>
1188 <document>
1189 <h1 myid="chapter1">...</h1>
1190 <p id="note1" class="note">...</p>
1191 <p>Regular paragraph.</p>
1192 <p xml:id="xmlid">XML:ID paragraph.</p>
1193 <p someid="warn1" class="warning">...</p>
1194 </document>
1195 '''
1196
1197 root, dic = XMLDTDID(xml_text)
1198 root2 = XML(xml_text)
1199 self.assertEquals(self._writeElement(root),
1200 self._writeElement(root2))
1201 expected = {
1202 "chapter1" : root[0],
1203 "xmlid" : root[3],
1204 "warn1" : root[4]
1205 }
1206 self.assert_("chapter1" in dic)
1207 self.assert_("warn1" in dic)
1208 self.assert_("xmlid" in dic)
1209 self._checkIDDict(dic, expected)
1210
1212 XMLDTDID = self.etree.XMLDTDID
1213 XML = self.etree.XML
1214 xml_text = '''
1215 <document>
1216 <h1 myid="chapter1">...</h1>
1217 <p id="note1" class="note">...</p>
1218 <p>Regular paragraph.</p>
1219 <p someid="warn1" class="warning">...</p>
1220 </document>
1221 '''
1222
1223 root, dic = XMLDTDID(xml_text)
1224 root2 = XML(xml_text)
1225 self.assertEquals(self._writeElement(root),
1226 self._writeElement(root2))
1227 expected = {}
1228 self._checkIDDict(dic, expected)
1229
1231 self.assertEquals(dic, expected)
1232 self.assertEquals(len(dic),
1233 len(expected))
1234 self.assertEquals(sorted(dic.items()),
1235 sorted(expected.items()))
1236 self.assertEquals(sorted(dic.iteritems()),
1237 sorted(expected.iteritems()))
1238 self.assertEquals(sorted(dic.keys()),
1239 sorted(expected.keys()))
1240 self.assertEquals(sorted(dic.iterkeys()),
1241 sorted(expected.iterkeys()))
1242 self.assertEquals(sorted(dic.values()),
1243 sorted(expected.values()))
1244 self.assertEquals(sorted(dic.itervalues()),
1245 sorted(expected.itervalues()))
1246
1248 etree = self.etree
1249
1250 r = {'foo': 'http://ns.infrae.com/foo'}
1251 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1252 self.assertEquals(
1253 'foo',
1254 e.prefix)
1255 self.assertEquals(
1256 '<foo:bar xmlns:foo="http://ns.infrae.com/foo"></foo:bar>',
1257 self._writeElement(e))
1258
1260 etree = self.etree
1261
1262 r = {None: 'http://ns.infrae.com/foo'}
1263 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1264 self.assertEquals(
1265 None,
1266 e.prefix)
1267 self.assertEquals(
1268 '{http://ns.infrae.com/foo}bar',
1269 e.tag)
1270 self.assertEquals(
1271 '<bar xmlns="http://ns.infrae.com/foo"></bar>',
1272 self._writeElement(e))
1273
1275 etree = self.etree
1276
1277 r = {None: 'http://ns.infrae.com/foo',
1278 'hoi': 'http://ns.infrae.com/hoi'}
1279 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1280 e.set('{http://ns.infrae.com/hoi}test', 'value')
1281 self.assertEquals(
1282 '<bar xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi" hoi:test="value"></bar>',
1283 self._writeElement(e))
1284
1286 etree = self.etree
1287 r = {None: 'http://ns.infrae.com/foo',
1288 'hoi': 'http://ns.infrae.com/hoi'}
1289 e = etree.Element('{http://ns.infrae.com/foo}z', nsmap=r)
1290 tree = etree.ElementTree(element=e)
1291 etree.SubElement(e, '{http://ns.infrae.com/hoi}x')
1292 self.assertEquals(
1293 '<z xmlns="http://ns.infrae.com/foo" xmlns:hoi="http://ns.infrae.com/hoi"><hoi:x></hoi:x></z>',
1294 self._writeElement(e))
1295
1297 etree = self.etree
1298
1299 r = {None: 'http://ns.infrae.com/foo'}
1300 e1 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1301 e2 = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1302
1303 e1.append(e2)
1304
1305 self.assertEquals(
1306 None,
1307 e1.prefix)
1308 self.assertEquals(
1309 None,
1310 e1[0].prefix)
1311 self.assertEquals(
1312 '{http://ns.infrae.com/foo}bar',
1313 e1.tag)
1314 self.assertEquals(
1315 '{http://ns.infrae.com/foo}bar',
1316 e1[0].tag)
1317
1319 etree = self.etree
1320
1321 r = {None: 'http://ns.infrae.com/BAR'}
1322 e1 = etree.Element('{http://ns.infrae.com/BAR}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.assertNotEquals(
1331 None,
1332 e2.prefix)
1333 self.assertEquals(
1334 '{http://ns.infrae.com/BAR}bar',
1335 e1.tag)
1336 self.assertEquals(
1337 '{http://ns.infrae.com/foo}bar',
1338 e2.tag)
1339
1341 ns_href = "http://a.b.c"
1342 one = self.etree.fromstring(
1343 '<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href)
1344 baz = one[0][0]
1345
1346 two = self.etree.fromstring(
1347 '<root xmlns:ns="%s"/>' % ns_href)
1348 two.append(baz)
1349 del one
1350
1351 self.assertEquals('{%s}baz' % ns_href, baz.tag)
1352 self.assertEquals(
1353 '<root xmlns:ns="%s"><ns:baz/></root>' % ns_href,
1354 self.etree.tostring(two))
1355
1357 parse = self.etree.parse
1358 tostring = self.etree.tostring
1359
1360 ns_href = "http://a.b.c"
1361 one = parse(
1362 StringIO('<foo><bar xmlns:ns="%s"><ns:baz/></bar></foo>' % ns_href))
1363 baz = one.getroot()[0][0]
1364
1365 parsed = parse(StringIO( tostring(baz) )).getroot()
1366 self.assertEquals('{%s}baz' % ns_href, parsed.tag)
1367
1369 etree = self.etree
1370
1371 r = {None: 'http://ns.infrae.com/foo',
1372 'hoi': 'http://ns.infrae.com/hoi'}
1373 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r)
1374 self.assertEquals(
1375 r,
1376 e.nsmap)
1377
1379 etree = self.etree
1380
1381 re = {None: 'http://ns.infrae.com/foo',
1382 'hoi': 'http://ns.infrae.com/hoi'}
1383 e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=re)
1384
1385 rs = {None: 'http://ns.infrae.com/honk',
1386 'top': 'http://ns.infrae.com/top'}
1387 s = etree.SubElement(e, '{http://ns.infrae.com/honk}bar', nsmap=rs)
1388
1389 r = re.copy()
1390 r.update(rs)
1391 self.assertEquals(
1392 re,
1393 e.nsmap)
1394 self.assertEquals(
1395 r,
1396 s.nsmap)
1397
1399 Element = self.etree.Element
1400 SubElement = self.etree.SubElement
1401
1402 a = Element('{a}a')
1403 b = SubElement(a, '{a}b')
1404 c = SubElement(a, '{a}c')
1405 d = SubElement(b, '{b}d')
1406 e = SubElement(c, '{a}e')
1407 f = SubElement(c, '{b}f')
1408
1409 self.assertEquals(
1410 [a],
1411 list(a.getiterator('{a}a')))
1412 self.assertEquals(
1413 [],
1414 list(a.getiterator('{b}a')))
1415 self.assertEquals(
1416 [],
1417 list(a.getiterator('a')))
1418 self.assertEquals(
1419 [f],
1420 list(c.getiterator('{b}*')))
1421 self.assertEquals(
1422 [d, f],
1423 list(a.getiterator('{b}*')))
1424
1449
1465
1482
1483 - def test_itertext(self):
1484
1485 XML = self.etree.XML
1486 root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")
1487
1488 text = list(root.itertext())
1489 self.assertEquals(["RTEXT", "ATAIL", "CTEXT", "CTAIL"],
1490 text)
1491
1493
1494 XML = self.etree.XML
1495 root = XML("<root>RTEXT<a></a>ATAIL<b/><c>CTEXT</c>CTAIL</root>")
1496
1497 text = list(root[2].itertext())
1498 self.assertEquals(["CTEXT"],
1499 text)
1500
1507
1514
1523
1525 XML = self.etree.XML
1526 root = XML('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')
1527 self.assertEquals(len(root.findall(".//{X}b")), 2)
1528 self.assertEquals(len(root.findall(".//{X}*")), 2)
1529 self.assertEquals(len(root.findall(".//b")), 3)
1530
1532 etree = self.etree
1533 e = etree.Element('foo')
1534 for i in range(10):
1535 etree.SubElement(e, 'a%s' % i)
1536 for i in range(10):
1537 self.assertEquals(
1538 i,
1539 e.index(e[i]))
1540 self.assertEquals(
1541 3, e.index(e[3], 3))
1542 self.assertRaises(
1543 ValueError, e.index, e[3], 4)
1544 self.assertRaises(
1545 ValueError, e.index, e[3], 0, 2)
1546 self.assertRaises(
1547 ValueError, e.index, e[8], 0, -3)
1548 self.assertRaises(
1549 ValueError, e.index, e[8], -5, -3)
1550 self.assertEquals(
1551 8, e.index(e[8], 0, -1))
1552 self.assertEquals(
1553 8, e.index(e[8], -12, -1))
1554 self.assertEquals(
1555 0, e.index(e[0], -12, -1))
1556
1558 etree = self.etree
1559 e = etree.Element('foo')
1560 for i in range(10):
1561 el = etree.SubElement(e, 'a%s' % i)
1562 el.text = "text%d" % i
1563 el.tail = "tail%d" % i
1564
1565 child0 = e[0]
1566 child1 = e[1]
1567 child2 = e[2]
1568
1569 e.replace(e[0], e[1])
1570 self.assertEquals(
1571 9, len(e))
1572 self.assertEquals(
1573 child1, e[0])
1574 self.assertEquals(
1575 child1.text, "text1")
1576 self.assertEquals(
1577 child1.tail, "tail1")
1578 self.assertEquals(
1579 child0.tail, "tail0")
1580 self.assertEquals(
1581 child2, e[1])
1582
1583 e.replace(e[-1], e[0])
1584 self.assertEquals(
1585 child1, e[-1])
1586 self.assertEquals(
1587 child1.text, "text1")
1588 self.assertEquals(
1589 child1.tail, "tail1")
1590 self.assertEquals(
1591 child2, e[0])
1592
1594 etree = self.etree
1595 e = etree.Element('foo')
1596 for i in range(10):
1597 etree.SubElement(e, 'a%s' % i)
1598
1599 new_element = etree.Element("test")
1600 new_element.text = "TESTTEXT"
1601 new_element.tail = "TESTTAIL"
1602 child1 = e[1]
1603 e.replace(e[0], new_element)
1604 self.assertEquals(
1605 new_element, e[0])
1606 self.assertEquals(
1607 "TESTTEXT",
1608 e[0].text)
1609 self.assertEquals(
1610 "TESTTAIL",
1611 e[0].tail)
1612 self.assertEquals(
1613 child1, e[1])
1614
1630
1648
1666
1684
1686 Element = self.etree.Element
1687 SubElement = self.etree.SubElement
1688 try:
1689 slice
1690 except NameError:
1691 print "slice() not found"
1692 return
1693
1694 a = Element('a')
1695 b = SubElement(a, 'b')
1696 c = SubElement(a, 'c')
1697 d = SubElement(a, 'd')
1698 e = SubElement(a, 'e')
1699
1700 x = Element('x')
1701 y = Element('y')
1702 z = Element('z')
1703
1704 self.assertRaises(
1705 ValueError,
1706 operator.setitem, a, slice(1,None,2), [x, y, z])
1707
1708 self.assertEquals(
1709 [b, c, d, e],
1710 list(a))
1711
1713 etree = self.etree
1714 root = etree.Element('foo')
1715 for i in range(3):
1716 element = etree.SubElement(root, 'a%s' % i)
1717 element.text = "text%d" % i
1718 element.tail = "tail%d" % i
1719
1720 elements = []
1721 for i in range(3):
1722 new_element = etree.Element("test%s" % i)
1723 new_element.text = "TEXT%s" % i
1724 new_element.tail = "TAIL%s" % i
1725 elements.append(new_element)
1726
1727 root.extend(elements)
1728
1729 self.assertEquals(
1730 ["a0", "a1", "a2", "test0", "test1", "test2"],
1731 [ el.tag for el in root ])
1732 self.assertEquals(
1733 ["text0", "text1", "text2", "TEXT0", "TEXT1", "TEXT2"],
1734 [ el.text for el in root ])
1735 self.assertEquals(
1736 ["tail0", "tail1", "tail2", "TAIL0", "TAIL1", "TAIL2"],
1737 [ el.tail for el in root ])
1738
1740 XML = self.etree.XML
1741 root = XML('''<?xml version="1.0"?>
1742 <root><test>
1743
1744 <bla/></test>
1745 </root>
1746 ''')
1747
1748 self.assertEquals(
1749 [2, 2, 4],
1750 [ el.sourceline for el in root.getiterator() ])
1751
1753 parse = self.etree.parse
1754 tree = parse(fileInTestDir('include/test_xinclude.xml'))
1755
1756 self.assertEquals(
1757 [1, 2, 3],
1758 [ el.sourceline for el in tree.getiterator() ])
1759
1768
1770 iterparse = self.etree.iterparse
1771 lines = [ el.sourceline for (event, el) in
1772 iterparse(fileInTestDir('include/test_xinclude.xml'),
1773 events=("start",)) ]
1774
1775 self.assertEquals(
1776 [1, 2, 3],
1777 lines)
1778
1788
1790 etree = self.etree
1791 root = etree.XML("<root/>", base_url="http://no/such/url")
1792 docinfo = root.getroottree().docinfo
1793 self.assertEquals(docinfo.URL, "http://no/such/url")
1794
1796 etree = self.etree
1797 tree = etree.parse(StringIO("<root/>"), base_url="http://no/such/url")
1798 docinfo = tree.docinfo
1799 self.assertEquals(docinfo.URL, "http://no/such/url")
1800
1802 etree = self.etree
1803 tree = etree.parse(fileInTestDir('include/test_xinclude.xml'),
1804 base_url="http://no/such/url")
1805 docinfo = tree.docinfo
1806 self.assertEquals(docinfo.URL, "http://no/such/url")
1807
1809 etree = self.etree
1810 root = etree.HTML("<html/>", base_url="http://no/such/url")
1811 docinfo = root.getroottree().docinfo
1812 self.assertEquals(docinfo.URL, "http://no/such/url")
1813
1815 etree = self.etree
1816 xml_header = '<?xml version="1.0" encoding="ascii"?>'
1817 pub_id = "-//W3C//DTD XHTML 1.0 Transitional//EN"
1818 sys_id = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
1819 doctype_string = '<!DOCTYPE html PUBLIC "%s" "%s">' % (pub_id, sys_id)
1820
1821 xml = xml_header + doctype_string + '<html><body></body></html>'
1822
1823 tree = etree.parse(StringIO(xml))
1824 docinfo = tree.docinfo
1825 self.assertEquals(docinfo.encoding, "ascii")
1826 self.assertEquals(docinfo.xml_version, "1.0")
1827 self.assertEquals(docinfo.public_id, pub_id)
1828 self.assertEquals(docinfo.system_url, sys_id)
1829 self.assertEquals(docinfo.root_name, 'html')
1830 self.assertEquals(docinfo.doctype, doctype_string)
1831
1833 etree = self.etree
1834 xml_header = '<?xml version="1.0" encoding="UTF-8"?>'
1835 sys_id = "some.dtd"
1836 doctype_string = '<!DOCTYPE html SYSTEM "%s">' % sys_id
1837 xml = xml_header + doctype_string + '<html><body></body></html>'
1838
1839 tree = etree.parse(StringIO(xml))
1840 docinfo = tree.docinfo
1841 self.assertEquals(docinfo.encoding, "UTF-8")
1842 self.assertEquals(docinfo.xml_version, "1.0")
1843 self.assertEquals(docinfo.public_id, None)
1844 self.assertEquals(docinfo.system_url, sys_id)
1845 self.assertEquals(docinfo.root_name, 'html')
1846 self.assertEquals(docinfo.doctype, doctype_string)
1847
1849 etree = self.etree
1850 xml = '<html><body></body></html>'
1851 tree = etree.parse(StringIO(xml))
1852 docinfo = tree.docinfo
1853 self.assertEquals(docinfo.encoding, None)
1854 self.assertEquals(docinfo.xml_version, "1.0")
1855 self.assertEquals(docinfo.public_id, None)
1856 self.assertEquals(docinfo.system_url, None)
1857 self.assertEquals(docinfo.root_name, 'html')
1858 self.assertEquals(docinfo.doctype, '')
1859
1861
1862 xml = '''\
1863 <!DOCTYPE test SYSTEM "test.dtd" [
1864 <!ENTITY entity "tasty">
1865 <!ELEMENT test (a)>
1866 <!ELEMENT a (#PCDATA)>
1867 ]>
1868 <test><a>test-test</a></test>\
1869 '''
1870 tree = self.etree.parse(StringIO(xml))
1871 self.assertEqual(self.etree.tostring(tree).replace(" ", ""),
1872 xml.replace(" ", ""))
1873
1875 Element = self.etree.Element
1876
1877 a = Element('a')
1878 self.assertRaises(AssertionError, setattr, a, "text", 'ha\0ho')
1879 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\0ho')
1880
1881 self.assertRaises(AssertionError, Element, 'ha\0ho')
1882
1884 Element = self.etree.Element
1885
1886 a = Element('a')
1887 self.assertRaises(AssertionError, setattr, a, "text", u'ha\0ho')
1888 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\0ho')
1889
1890 self.assertRaises(AssertionError, Element, u'ha\0ho')
1891
1893 Element = self.etree.Element
1894
1895 a = Element('a')
1896 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x07ho')
1897 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x02ho')
1898
1899 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x07ho')
1900 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x02ho')
1901
1902 self.assertRaises(AssertionError, Element, 'ha\x07ho')
1903 self.assertRaises(AssertionError, Element, 'ha\x02ho')
1904
1906 Element = self.etree.Element
1907
1908 a = Element('a')
1909 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x07ho')
1910 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x02ho')
1911
1912 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x07ho')
1913 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x02ho')
1914
1915 self.assertRaises(AssertionError, Element, u'ha\x07ho')
1916 self.assertRaises(AssertionError, Element, u'ha\x02ho')
1917
1931
1936
1954
1974
1976 tostring = self.etree.tostring
1977 Element = self.etree.Element
1978 SubElement = self.etree.SubElement
1979
1980 a = Element('a')
1981 a.text = "A"
1982 a.tail = "tail"
1983 b = SubElement(a, 'b')
1984 b.text = "B"
1985 b.tail = u"Søk på nettet"
1986 c = SubElement(a, 'c')
1987 c.text = "C"
1988
1989 result = tostring(a, method="text", encoding="UTF-16")
1990
1991 self.assertEquals(u'ABSøk på nettetCtail'.encode("UTF-16"),
1992 result)
1993
2006
2022
2026
2041
2059
2072
2074 tostring = self.etree.tostring
2075 Element = self.etree.Element
2076 SubElement = self.etree.SubElement
2077
2078 a = Element('a')
2079 b = SubElement(a, 'b')
2080 c = SubElement(a, 'c')
2081 d = SubElement(c, 'd')
2082 self.assert_(isinstance(tostring(b, encoding=unicode), unicode))
2083 self.assert_(isinstance(tostring(c, encoding=unicode), unicode))
2084 self.assertEquals('<b></b>',
2085 canonicalize(tostring(b, encoding=unicode)))
2086 self.assertEquals('<c><d></d></c>',
2087 canonicalize(tostring(c, encoding=unicode)))
2088
2093
2108
2110 tostring = self.etree.tostring
2111 Element = self.etree.Element
2112 SubElement = self.etree.SubElement
2113
2114 a = Element('a')
2115 b = SubElement(a, 'b')
2116 c = SubElement(a, 'c')
2117
2118 result = tostring(a, encoding=unicode)
2119 self.assertEquals(result, "<a><b/><c/></a>")
2120
2121 result = tostring(a, encoding=unicode, pretty_print=False)
2122 self.assertEquals(result, "<a><b/><c/></a>")
2123
2124 result = tostring(a, encoding=unicode, pretty_print=True)
2125 self.assertEquals(result, "<a>\n <b/>\n <c/>\n</a>\n")
2126
2127
2128
2138
2139
2142 filename = fileInTestDir('test_broken.xml')
2143 root = etree.XML('''\
2144 <doc xmlns:xi="http://www.w3.org/2001/XInclude">
2145 <xi:include href="%s" parse="text"/>
2146 </doc>
2147 ''' % filename)
2148 old_text = root.text
2149 content = open(filename).read()
2150 old_tail = root[0].tail
2151
2152 self.include( etree.ElementTree(root) )
2153 self.assertEquals(old_text + content + old_tail,
2154 root.text)
2155
2157 tree = etree.parse(fileInTestDir('include/test_xinclude.xml'))
2158 self.assertNotEquals(
2159 'a',
2160 tree.getroot()[1].tag)
2161
2162 self.include( tree )
2163
2164 self.assertEquals(
2165 'a',
2166 tree.getroot()[1].tag)
2167
2171
2172
2177
2178
2181 tree = self.parse('<a><b/></a>')
2182 f = StringIO()
2183 tree.write_c14n(f)
2184 s = f.getvalue()
2185 self.assertEquals('<a><b></b></a>',
2186 s)
2187
2189 suite = unittest.TestSuite()
2190 suite.addTests([unittest.makeSuite(ETreeOnlyTestCase)])
2191 suite.addTests([unittest.makeSuite(ETreeXIncludeTestCase)])
2192 suite.addTests([unittest.makeSuite(ElementIncludeTestCase)])
2193 suite.addTests([unittest.makeSuite(ETreeC14NTestCase)])
2194 suite.addTests(
2195 [doctest.DocFileSuite('../../../doc/tutorial.txt')])
2196 suite.addTests(
2197 [doctest.DocFileSuite('../../../doc/api.txt')])
2198 suite.addTests(
2199 [doctest.DocFileSuite('../../../doc/parsing.txt')])
2200 suite.addTests(
2201 [doctest.DocFileSuite('../../../doc/resolvers.txt')])
2202 return suite
2203
2204 if __name__ == '__main__':
2205 print 'to test use test.py %s' % __file__
2206