reader.py revision 48ef4c98d226ef792da8aae26d3c73f090a7e49e
1#!/usr/bin/python -u
2#
3# this tests the basic APIs of the XmlTextReader interface
4#
5import libxml2
6import StringIO
7import sys
8
9# Memory debug specific
10libxml2.debugMemory(1)
11
12f = StringIO.StringIO("""<a><b b1="b1"/><c>content of c</c></a>""")
13input = libxml2.inputBuffer(f)
14reader = input.newTextReader("test1")
15ret = reader.Read()
16if ret != 1:
17    print "test1: Error reading to first element"
18    sys.exit(1)
19if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \
20   reader.NodeType() != 1 or reader.HasAttributes() != 0:
21    print "test1: Error reading the first element"
22    sys.exit(1)
23ret = reader.Read()
24if ret != 1:
25    print "test1: Error reading to second element"
26    sys.exit(1)
27if reader.Name() != "b" or reader.IsEmptyElement() != 1 or \
28   reader.NodeType() != 1 or reader.HasAttributes() != 1:
29    print "test1: Error reading the second element"
30    sys.exit(1)
31ret = reader.Read()
32if ret != 1:
33    print "test1: Error reading to third element"
34    sys.exit(1)
35if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \
36   reader.NodeType() != 1 or reader.HasAttributes() != 0:
37    print "test1: Error reading the third element"
38    sys.exit(1)
39ret = reader.Read()
40if ret != 1:
41    print "test1: Error reading to text node"
42    sys.exit(1)
43if reader.Name() != "#text" or reader.IsEmptyElement() != 0 or \
44   reader.NodeType() != 3 or reader.HasAttributes() != 0 or \
45   reader.Value() != "content of c":
46    print "test1: Error reading the text node"
47    sys.exit(1)
48ret = reader.Read()
49if ret != 1:
50    print "test1: Error reading to end of third element"
51    sys.exit(1)
52if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \
53   reader.NodeType() != 15 or reader.HasAttributes() != 0:
54    print "test1: Error reading the end of third element"
55    sys.exit(1)
56ret = reader.Read()
57if ret != 1:
58    print "test1: Error reading to end of first element"
59    sys.exit(1)
60if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \
61   reader.NodeType() != 15 or reader.HasAttributes() != 0:
62    print "test1: Error reading the end of first element"
63    sys.exit(1)
64ret = reader.Read()
65if ret != 0:
66    print "test1: Error reading to end of document"
67    sys.exit(1)
68
69#
70# example from the XmlTextReader docs
71#
72f = StringIO.StringIO("""<test xmlns:dt="urn:datatypes" dt:type="int"/>""")
73input = libxml2.inputBuffer(f)
74reader = input.newTextReader("test2")
75
76ret = reader.Read()
77if ret != 1:
78    print "Error reading test element"
79    sys.exit(1)
80if reader.GetAttributeNo(0) != "urn:datatypes" or \
81   reader.GetAttributeNo(1) != "int" or \
82   reader.GetAttributeNs("type", "urn:datatypes") != "int" or \
83   reader.GetAttribute("dt:type") != "int":
84    print "error reading test attributes"
85    sys.exit(1)
86
87#
88# example from the XmlTextReader docs
89#
90f = StringIO.StringIO("""<root xmlns:a="urn:456">
91<item>
92<ref href="a:b"/>
93</item>
94</root>""")
95input = libxml2.inputBuffer(f)
96reader = input.newTextReader("test3")
97
98ret = reader.Read()
99while ret == 1:
100    if reader.Name() == "ref":
101        if reader.LookupNamespace("a") != "urn:456":
102	    print "error resolving namespace prefix"
103	    sys.exit(1)
104	break
105    ret = reader.Read()
106if ret != 1:
107    print "Error finding the ref element"
108    sys.exit(1)
109
110#
111# Home made example for the various attribute access functions
112#
113f = StringIO.StringIO("""<testattr xmlns="urn:1" xmlns:a="urn:2" b="b" a:b="a:b"/>""")
114input = libxml2.inputBuffer(f)
115reader = input.newTextReader("test4")
116ret = reader.Read()
117if ret != 1:
118    print "Error reading the testattr element"
119    sys.exit(1)
120#
121# Attribute exploration by index
122#
123if reader.MoveToAttributeNo(0) != 1:
124    print "Failed moveToAttribute(0)"
125    sys.exit(1)
126if reader.Value() != "urn:1":
127    print "Failed to read attribute(0)"
128    sys.exit(1)
129if reader.Name() != "xmlns":
130    print "Failed to read attribute(0) name"
131    sys.exit(1)
132if reader.MoveToAttributeNo(1) != 1:
133    print "Failed moveToAttribute(1)"
134    sys.exit(1)
135if reader.Value() != "urn:2":
136    print "Failed to read attribute(1)"
137    sys.exit(1)
138if reader.Name() != "xmlns:a":
139    print "Failed to read attribute(1) name"
140    sys.exit(1)
141if reader.MoveToAttributeNo(2) != 1:
142    print "Failed moveToAttribute(2)"
143    sys.exit(1)
144if reader.Value() != "b":
145    print "Failed to read attribute(2)"
146    sys.exit(1)
147if reader.Name() != "b":
148    print "Failed to read attribute(2) name"
149    sys.exit(1)
150if reader.MoveToAttributeNo(3) != 1:
151    print "Failed moveToAttribute(3)"
152    sys.exit(1)
153if reader.Value() != "a:b":
154    print "Failed to read attribute(3)"
155    sys.exit(1)
156if reader.Name() != "a:b":
157    print "Failed to read attribute(3) name"
158    sys.exit(1)
159#
160# Attribute exploration by name
161#
162if reader.MoveToAttribute("xmlns") != 1:
163    print "Failed moveToAttribute('xmlns')"
164    sys.exit(1)
165if reader.Value() != "urn:1":
166    print "Failed to read attribute('xmlns')"
167    sys.exit(1)
168if reader.MoveToAttribute("xmlns:a") != 1:
169    print "Failed moveToAttribute('xmlns')"
170    sys.exit(1)
171if reader.Value() != "urn:2":
172    print "Failed to read attribute('xmlns:a')"
173    sys.exit(1)
174if reader.MoveToAttribute("b") != 1:
175    print "Failed moveToAttribute('b')"
176    sys.exit(1)
177if reader.Value() != "b":
178    print "Failed to read attribute('b')"
179    sys.exit(1)
180if reader.MoveToAttribute("a:b") != 1:
181    print "Failed moveToAttribute('a:b')"
182    sys.exit(1)
183if reader.Value() != "a:b":
184    print "Failed to read attribute('a:b')"
185    sys.exit(1)
186if reader.MoveToAttributeNs("b", "urn:2") != 1:
187    print "Failed moveToAttribute('b', 'urn:2')"
188    sys.exit(1)
189if reader.Value() != "a:b":
190    print "Failed to read attribute('b', 'urn:2')"
191    sys.exit(1)
192#
193# Go back and read in sequence
194#
195if reader.MoveToElement() != 1:
196    print "Failed to move back to element"
197    sys.exit(1)
198if reader.MoveToFirstAttribute() != 1:
199    print "Failed to move to first attribute"
200    sys.exit(1)
201if reader.Value() != "urn:1":
202    print "Failed to read attribute(0)"
203    sys.exit(1)
204if reader.Name() != "xmlns":
205    print "Failed to read attribute(0) name"
206    sys.exit(1)
207if reader.MoveToNextAttribute() != 1:
208    print "Failed to move to next attribute"
209    sys.exit(1)
210if reader.Value() != "urn:2":
211    print "Failed to read attribute(1)"
212    sys.exit(1)
213if reader.Name() != "xmlns:a":
214    print "Failed to read attribute(1) name"
215    sys.exit(1)
216if reader.MoveToNextAttribute() != 1:
217    print "Failed to move to next attribute"
218    sys.exit(1)
219if reader.Value() != "b":
220    print "Failed to read attribute(2)"
221    sys.exit(1)
222if reader.Name() != "b":
223    print "Failed to read attribute(2) name"
224    sys.exit(1)
225if reader.MoveToNextAttribute() != 1:
226    print "Failed to move to next attribute"
227    sys.exit(1)
228if reader.Value() != "a:b":
229    print "Failed to read attribute(3)"
230    sys.exit(1)
231if reader.Name() != "a:b":
232    print "Failed to read attribute(3) name"
233    sys.exit(1)
234if reader.MoveToNextAttribute() != 0:
235    print "Failed to detect last attribute"
236    sys.exit(1)
237
238
239#
240# a couple of tests for namespace nodes
241#
242f = StringIO.StringIO("""<a xmlns="http://example.com/foo"/>""")
243input = libxml2.inputBuffer(f)
244reader = input.newTextReader("test6")
245ret = reader.Read()
246if ret != 1:
247    print "test6: failed to Read()"
248    sys.exit(1)
249ret = reader.MoveToFirstAttribute()
250if ret != 1:
251    print "test6: failed to MoveToFirstAttribute()"
252    sys.exit(1)
253if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \
254   reader.LocalName() != "xmlns" or reader.Name() != "xmlns" or \
255   reader.Value() != "http://example.com/foo" or reader.NodeType() != 2:
256    print "test6: failed to read the namespace node"
257    sys.exit(1)
258
259f = StringIO.StringIO("""<a xmlns:prefix="http://example.com/foo"/>""")
260input = libxml2.inputBuffer(f)
261reader = input.newTextReader("test7")
262ret = reader.Read()
263if ret != 1:
264    print "test7: failed to Read()"
265    sys.exit(1)
266ret = reader.MoveToFirstAttribute()
267if ret != 1:
268    print "test7: failed to MoveToFirstAttribute()"
269    sys.exit(1)
270if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \
271   reader.LocalName() != "prefix" or reader.Name() != "xmlns:prefix" or \
272   reader.Value() != "http://example.com/foo" or reader.NodeType() != 2:
273    print "test7: failed to read the namespace node"
274    sys.exit(1)
275
276#
277# Test for a limit case:
278#
279f = StringIO.StringIO("""<a/>""")
280input = libxml2.inputBuffer(f)
281reader = input.newTextReader("test8")
282ret = reader.Read()
283if ret != 1:
284    print "test8: failed to read the node"
285    sys.exit(1)
286if reader.Name() != "a" or reader.IsEmptyElement() != 1:
287    print "test8: failed to analyze the node"
288    sys.exit(1)
289ret = reader.Read()
290if ret != 0:
291    print "test8: failed to detect the EOF"
292    sys.exit(1)
293
294#
295# Another test provided by St�phane Bidoul and checked with C#
296#
297def tst_reader(s):
298    f = StringIO.StringIO(s)
299    input = libxml2.inputBuffer(f)
300    reader = input.newTextReader("tst")
301    res = ""
302    while reader.Read():
303	res=res + "%s (%s) [%s] %d %d\n" % (reader.NodeType(),reader.Name(),
304				      reader.Value(), reader.IsEmptyElement(),
305				      reader.Depth())
306	if reader.NodeType() == 1: # Element
307	    while reader.MoveToNextAttribute():
308		res = res + "-- %s (%s) [%s] %d %d\n" % (reader.NodeType(),
309				       reader.Name(),reader.Value(),
310				       reader.IsEmptyElement(), reader.Depth())
311    return res
312
313doc="""<a><b b1="b1"/><c>content of c</c></a>"""
314expect="""1 (a) [None] 0 0
3151 (b) [None] 1 1
316-- 2 (b1) [b1] 0 2
3171 (c) [None] 0 1
3183 (#text) [content of c] 0 2
31915 (c) [None] 0 1
32015 (a) [None] 0 0
321"""
322res = tst_reader(doc)
323if res != expect:
324    print "test5 failed"
325    print res
326    sys.exit(1)
327
328doc="""<test><b/><c/></test>"""
329expect="""1 (test) [None] 0 0
3301 (b) [None] 1 1
3311 (c) [None] 1 1
33215 (test) [None] 0 0
333"""
334res = tst_reader(doc)
335if res != expect:
336    print "test9 failed"
337    print res
338    sys.exit(1)
339
340doc="""<a><b>bbb</b><c>ccc</c></a>"""
341expect="""1 (a) [None] 0 0
3421 (b) [None] 0 1
3433 (#text) [bbb] 0 2
34415 (b) [None] 0 1
3451 (c) [None] 0 1
3463 (#text) [ccc] 0 2
34715 (c) [None] 0 1
34815 (a) [None] 0 0
349"""
350res = tst_reader(doc)
351if res != expect:
352    print "test10 failed"
353    print res
354    sys.exit(1)
355
356doc="""<test a="a"/>"""
357expect="""1 (test) [None] 1 0
358-- 2 (a) [a] 0 1
359"""
360res = tst_reader(doc)
361if res != expect:
362    print "test11 failed"
363    print res
364    sys.exit(1)
365
366doc="""<test><a>aaa</a><b/></test>"""
367expect="""1 (test) [None] 0 0
3681 (a) [None] 0 1
3693 (#text) [aaa] 0 2
37015 (a) [None] 0 1
3711 (b) [None] 1 1
37215 (test) [None] 0 0
373"""
374res = tst_reader(doc)
375if res != expect:
376    print "test12 failed"
377    print res
378    sys.exit(1)
379
380doc="""<test><p></p></test>"""
381expect="""1 (test) [None] 0 0
3821 (p) [None] 0 1
38315 (p) [None] 0 1
38415 (test) [None] 0 0
385"""
386res = tst_reader(doc)
387if res != expect:
388    print "test13 failed"
389    print res
390    sys.exit(1)
391
392doc="""<p></p>"""
393expect="""1 (p) [None] 0 0
39415 (p) [None] 0 0
395"""
396res = tst_reader(doc)
397if res != expect:
398    print "test14 failed"
399    print res
400    sys.exit(1)
401
402#
403# test from bug #108801
404#
405doc="""<?xml version="1.0" standalone="no"?>
406<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
407                  "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
408]>
409
410<article>
411xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
412</article>
413"""
414expect="""10 (article) [None] 0 0
4151 (article) [None] 0 0
4163 (#text) [
417xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
418] 0 1
41915 (article) [None] 0 0
420"""
421res = tst_reader(doc)
422if res != expect:
423    print "test15 failed"
424    print res
425    sys.exit(1)
426
427#
428# cleanup for memory allocation counting
429#
430del f
431del input
432del reader
433
434# Memory debug specific
435libxml2.cleanupParser()
436if libxml2.debugMemory(1) == 0:
437    print "OK"
438else:
439    print "Memory leak %d bytes" % (libxml2.debugMemory(1))
440    libxml2.dumpMemory()
441