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
1502 XML = self.etree.XML
1503 root = XML('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')
1504 self.assertEquals(len(root.findall(".//{X}b")), 2)
1505 self.assertEquals(len(root.findall(".//{X}*")), 2)
1506 self.assertEquals(len(root.findall(".//b")), 3)
1507
1509 etree = self.etree
1510 e = etree.Element('foo')
1511 for i in range(10):
1512 etree.SubElement(e, 'a%s' % i)
1513 for i in range(10):
1514 self.assertEquals(
1515 i,
1516 e.index(e[i]))
1517 self.assertEquals(
1518 3, e.index(e[3], 3))
1519 self.assertRaises(
1520 ValueError, e.index, e[3], 4)
1521 self.assertRaises(
1522 ValueError, e.index, e[3], 0, 2)
1523 self.assertRaises(
1524 ValueError, e.index, e[8], 0, -3)
1525 self.assertRaises(
1526 ValueError, e.index, e[8], -5, -3)
1527 self.assertEquals(
1528 8, e.index(e[8], 0, -1))
1529 self.assertEquals(
1530 8, e.index(e[8], -12, -1))
1531 self.assertEquals(
1532 0, e.index(e[0], -12, -1))
1533
1535 etree = self.etree
1536 e = etree.Element('foo')
1537 for i in range(10):
1538 el = etree.SubElement(e, 'a%s' % i)
1539 el.text = "text%d" % i
1540 el.tail = "tail%d" % i
1541
1542 child0 = e[0]
1543 child1 = e[1]
1544 child2 = e[2]
1545
1546 e.replace(e[0], e[1])
1547 self.assertEquals(
1548 9, len(e))
1549 self.assertEquals(
1550 child1, e[0])
1551 self.assertEquals(
1552 child1.text, "text1")
1553 self.assertEquals(
1554 child1.tail, "tail1")
1555 self.assertEquals(
1556 child0.tail, "tail0")
1557 self.assertEquals(
1558 child2, e[1])
1559
1560 e.replace(e[-1], e[0])
1561 self.assertEquals(
1562 child1, e[-1])
1563 self.assertEquals(
1564 child1.text, "text1")
1565 self.assertEquals(
1566 child1.tail, "tail1")
1567 self.assertEquals(
1568 child2, e[0])
1569
1571 etree = self.etree
1572 e = etree.Element('foo')
1573 for i in range(10):
1574 etree.SubElement(e, 'a%s' % i)
1575
1576 new_element = etree.Element("test")
1577 new_element.text = "TESTTEXT"
1578 new_element.tail = "TESTTAIL"
1579 child1 = e[1]
1580 e.replace(e[0], new_element)
1581 self.assertEquals(
1582 new_element, e[0])
1583 self.assertEquals(
1584 "TESTTEXT",
1585 e[0].text)
1586 self.assertEquals(
1587 "TESTTAIL",
1588 e[0].tail)
1589 self.assertEquals(
1590 child1, e[1])
1591
1607
1625
1643
1661
1663 Element = self.etree.Element
1664 SubElement = self.etree.SubElement
1665 try:
1666 slice
1667 except NameError:
1668 print "slice() not found"
1669 return
1670
1671 a = Element('a')
1672 b = SubElement(a, 'b')
1673 c = SubElement(a, 'c')
1674 d = SubElement(a, 'd')
1675 e = SubElement(a, 'e')
1676
1677 x = Element('x')
1678 y = Element('y')
1679 z = Element('z')
1680
1681 self.assertRaises(
1682 ValueError,
1683 operator.setitem, a, slice(1,None,2), [x, y, z])
1684
1685 self.assertEquals(
1686 [b, c, d, e],
1687 list(a))
1688
1690 etree = self.etree
1691 root = etree.Element('foo')
1692 for i in range(3):
1693 element = etree.SubElement(root, 'a%s' % i)
1694 element.text = "text%d" % i
1695 element.tail = "tail%d" % i
1696
1697 elements = []
1698 for i in range(3):
1699 new_element = etree.Element("test%s" % i)
1700 new_element.text = "TEXT%s" % i
1701 new_element.tail = "TAIL%s" % i
1702 elements.append(new_element)
1703
1704 root.extend(elements)
1705
1706 self.assertEquals(
1707 ["a0", "a1", "a2", "test0", "test1", "test2"],
1708 [ el.tag for el in root ])
1709 self.assertEquals(
1710 ["text0", "text1", "text2", "TEXT0", "TEXT1", "TEXT2"],
1711 [ el.text for el in root ])
1712 self.assertEquals(
1713 ["tail0", "tail1", "tail2", "TAIL0", "TAIL1", "TAIL2"],
1714 [ el.tail for el in root ])
1715
1717 XML = self.etree.XML
1718 root = XML('''<?xml version="1.0"?>
1719 <root><test>
1720
1721 <bla/></test>
1722 </root>
1723 ''')
1724
1725 self.assertEquals(
1726 [2, 2, 4],
1727 [ el.sourceline for el in root.getiterator() ])
1728
1730 parse = self.etree.parse
1731 tree = parse(fileInTestDir('include/test_xinclude.xml'))
1732
1733 self.assertEquals(
1734 [1, 2, 3],
1735 [ el.sourceline for el in tree.getiterator() ])
1736
1745
1747 iterparse = self.etree.iterparse
1748 lines = [ el.sourceline for (event, el) in
1749 iterparse(fileInTestDir('include/test_xinclude.xml'),
1750 events=("start",)) ]
1751
1752 self.assertEquals(
1753 [1, 2, 3],
1754 lines)
1755
1765
1767 etree = self.etree
1768 root = etree.XML("<root/>", base_url="http://no/such/url")
1769 docinfo = root.getroottree().docinfo
1770 self.assertEquals(docinfo.URL, "http://no/such/url")
1771
1773 etree = self.etree
1774 tree = etree.parse(StringIO("<root/>"), base_url="http://no/such/url")
1775 docinfo = tree.docinfo
1776 self.assertEquals(docinfo.URL, "http://no/such/url")
1777
1779 etree = self.etree
1780 tree = etree.parse(fileInTestDir('include/test_xinclude.xml'),
1781 base_url="http://no/such/url")
1782 docinfo = tree.docinfo
1783 self.assertEquals(docinfo.URL, "http://no/such/url")
1784
1786 etree = self.etree
1787 root = etree.HTML("<html/>", base_url="http://no/such/url")
1788 docinfo = root.getroottree().docinfo
1789 self.assertEquals(docinfo.URL, "http://no/such/url")
1790
1792 etree = self.etree
1793 xml_header = '<?xml version="1.0" encoding="ascii"?>'
1794 pub_id = "-//W3C//DTD XHTML 1.0 Transitional//EN"
1795 sys_id = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
1796 doctype_string = '<!DOCTYPE html PUBLIC "%s" "%s">' % (pub_id, sys_id)
1797
1798 xml = xml_header + doctype_string + '<html><body></body></html>'
1799
1800 tree = etree.parse(StringIO(xml))
1801 docinfo = tree.docinfo
1802 self.assertEquals(docinfo.encoding, "ascii")
1803 self.assertEquals(docinfo.xml_version, "1.0")
1804 self.assertEquals(docinfo.public_id, pub_id)
1805 self.assertEquals(docinfo.system_url, sys_id)
1806 self.assertEquals(docinfo.root_name, 'html')
1807 self.assertEquals(docinfo.doctype, doctype_string)
1808
1810 etree = self.etree
1811 xml_header = '<?xml version="1.0" encoding="UTF-8"?>'
1812 sys_id = "some.dtd"
1813 doctype_string = '<!DOCTYPE html SYSTEM "%s">' % sys_id
1814 xml = xml_header + doctype_string + '<html><body></body></html>'
1815
1816 tree = etree.parse(StringIO(xml))
1817 docinfo = tree.docinfo
1818 self.assertEquals(docinfo.encoding, "UTF-8")
1819 self.assertEquals(docinfo.xml_version, "1.0")
1820 self.assertEquals(docinfo.public_id, None)
1821 self.assertEquals(docinfo.system_url, sys_id)
1822 self.assertEquals(docinfo.root_name, 'html')
1823 self.assertEquals(docinfo.doctype, doctype_string)
1824
1826 etree = self.etree
1827 xml = '<html><body></body></html>'
1828 tree = etree.parse(StringIO(xml))
1829 docinfo = tree.docinfo
1830 self.assertEquals(docinfo.encoding, None)
1831 self.assertEquals(docinfo.xml_version, "1.0")
1832 self.assertEquals(docinfo.public_id, None)
1833 self.assertEquals(docinfo.system_url, None)
1834 self.assertEquals(docinfo.root_name, 'html')
1835 self.assertEquals(docinfo.doctype, '')
1836
1838
1839 xml = '''\
1840 <!DOCTYPE test SYSTEM "test.dtd" [
1841 <!ENTITY entity "tasty">
1842 <!ELEMENT test (a)>
1843 <!ELEMENT a (#PCDATA)>
1844 ]>
1845 <test><a>test-test</a></test>\
1846 '''
1847 tree = self.etree.parse(StringIO(xml))
1848 self.assertEqual(self.etree.tostring(tree).replace(" ", ""),
1849 xml.replace(" ", ""))
1850
1852 Element = self.etree.Element
1853
1854 a = Element('a')
1855 self.assertRaises(AssertionError, setattr, a, "text", 'ha\0ho')
1856 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\0ho')
1857
1858 self.assertRaises(AssertionError, Element, 'ha\0ho')
1859
1861 Element = self.etree.Element
1862
1863 a = Element('a')
1864 self.assertRaises(AssertionError, setattr, a, "text", u'ha\0ho')
1865 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\0ho')
1866
1867 self.assertRaises(AssertionError, Element, u'ha\0ho')
1868
1870 Element = self.etree.Element
1871
1872 a = Element('a')
1873 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x07ho')
1874 self.assertRaises(AssertionError, setattr, a, "text", 'ha\x02ho')
1875
1876 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x07ho')
1877 self.assertRaises(AssertionError, setattr, a, "tail", 'ha\x02ho')
1878
1879 self.assertRaises(AssertionError, Element, 'ha\x07ho')
1880 self.assertRaises(AssertionError, Element, 'ha\x02ho')
1881
1883 Element = self.etree.Element
1884
1885 a = Element('a')
1886 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x07ho')
1887 self.assertRaises(AssertionError, setattr, a, "text", u'ha\x02ho')
1888
1889 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x07ho')
1890 self.assertRaises(AssertionError, setattr, a, "tail", u'ha\x02ho')
1891
1892 self.assertRaises(AssertionError, Element, u'ha\x07ho')
1893 self.assertRaises(AssertionError, Element, u'ha\x02ho')
1894
1908
1913
1931
1951
1953 tostring = self.etree.tostring
1954 Element = self.etree.Element
1955 SubElement = self.etree.SubElement
1956
1957 a = Element('a')
1958 a.text = "A"
1959 a.tail = "tail"
1960 b = SubElement(a, 'b')
1961 b.text = "B"
1962 b.tail = u"Søk på nettet"
1963 c = SubElement(a, 'c')
1964 c.text = "C"
1965
1966 result = tostring(a, method="text", encoding="UTF-16")
1967
1968 self.assertEquals(u'ABSøk på nettetCtail'.encode("UTF-16"),
1969 result)
1970
1983
1999
2003
2018
2036
2049
2051 tostring = self.etree.tostring
2052 Element = self.etree.Element
2053 SubElement = self.etree.SubElement
2054
2055 a = Element('a')
2056 b = SubElement(a, 'b')
2057 c = SubElement(a, 'c')
2058 d = SubElement(c, 'd')
2059 self.assert_(isinstance(tostring(b, encoding=unicode), unicode))
2060 self.assert_(isinstance(tostring(c, encoding=unicode), unicode))
2061 self.assertEquals('<b></b>',
2062 canonicalize(tostring(b, encoding=unicode)))
2063 self.assertEquals('<c><d></d></c>',
2064 canonicalize(tostring(c, encoding=unicode)))
2065
2070
2085
2087 tostring = self.etree.tostring
2088 Element = self.etree.Element
2089 SubElement = self.etree.SubElement
2090
2091 a = Element('a')
2092 b = SubElement(a, 'b')
2093 c = SubElement(a, 'c')
2094
2095 result = tostring(a, encoding=unicode)
2096 self.assertEquals(result, "<a><b/><c/></a>")
2097
2098 result = tostring(a, encoding=unicode, pretty_print=False)
2099 self.assertEquals(result, "<a><b/><c/></a>")
2100
2101 result = tostring(a, encoding=unicode, pretty_print=True)
2102 self.assertEquals(result, "<a>\n <b/>\n <c/>\n</a>\n")
2103
2104
2105
2115
2116
2119 filename = fileInTestDir('test_broken.xml')
2120 root = etree.XML('''\
2121 <doc xmlns:xi="http://www.w3.org/2001/XInclude">
2122 <xi:include href="%s" parse="text"/>
2123 </doc>
2124 ''' % filename)
2125 old_text = root.text
2126 content = open(filename).read()
2127 old_tail = root[0].tail
2128
2129 self.include( etree.ElementTree(root) )
2130 self.assertEquals(old_text + content + old_tail,
2131 root.text)
2132
2134 tree = etree.parse(fileInTestDir('include/test_xinclude.xml'))
2135 self.assertNotEquals(
2136 'a',
2137 tree.getroot()[1].tag)
2138
2139 self.include( tree )
2140
2141 self.assertEquals(
2142 'a',
2143 tree.getroot()[1].tag)
2144
2148
2149
2154
2155
2158 tree = self.parse('<a><b/></a>')
2159 f = StringIO()
2160 tree.write_c14n(f)
2161 s = f.getvalue()
2162 self.assertEquals('<a><b></b></a>',
2163 s)
2164
2166 suite = unittest.TestSuite()
2167 suite.addTests([unittest.makeSuite(ETreeOnlyTestCase)])
2168 suite.addTests([unittest.makeSuite(ETreeXIncludeTestCase)])
2169 suite.addTests([unittest.makeSuite(ElementIncludeTestCase)])
2170 suite.addTests([unittest.makeSuite(ETreeC14NTestCase)])
2171 suite.addTests(
2172 [doctest.DocFileSuite('../../../doc/tutorial.txt')])
2173 suite.addTests(
2174 [doctest.DocFileSuite('../../../doc/api.txt')])
2175 suite.addTests(
2176 [doctest.DocFileSuite('../../../doc/parsing.txt')])
2177 suite.addTests(
2178 [doctest.DocFileSuite('../../../doc/resolvers.txt')])
2179 return suite
2180
2181 if __name__ == '__main__':
2182 print 'to test use test.py %s' % __file__
2183