2 # -*- coding: ISO-8859-1 -*-
4 # this tests the basic APIs of the XmlTextReader interface
10 # Memory debug specific
11 libxml2.debugMemory(1)
13 f = StringIO.StringIO("""<a><b b1="b1"/><c>content of c</c></a>""")
14 input = libxml2.inputBuffer(f)
15 reader = input.newTextReader("test1")
18 print "test1: Error reading to first element"
20 if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \
21 reader.NodeType() != 1 or reader.HasAttributes() != 0:
22 print "test1: Error reading the first element"
26 print "test1: Error reading to second element"
28 if reader.Name() != "b" or reader.IsEmptyElement() != 1 or \
29 reader.NodeType() != 1 or reader.HasAttributes() != 1:
30 print "test1: Error reading the second element"
34 print "test1: Error reading to third element"
36 if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \
37 reader.NodeType() != 1 or reader.HasAttributes() != 0:
38 print "test1: Error reading the third element"
42 print "test1: Error reading to text node"
44 if reader.Name() != "#text" or reader.IsEmptyElement() != 0 or \
45 reader.NodeType() != 3 or reader.HasAttributes() != 0 or \
46 reader.Value() != "content of c":
47 print "test1: Error reading the text node"
51 print "test1: Error reading to end of third element"
53 if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \
54 reader.NodeType() != 15 or reader.HasAttributes() != 0:
55 print "test1: Error reading the end of third element"
59 print "test1: Error reading to end of first element"
61 if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \
62 reader.NodeType() != 15 or reader.HasAttributes() != 0:
63 print "test1: Error reading the end of first element"
67 print "test1: Error reading to end of document"
71 # example from the XmlTextReader docs
73 f = StringIO.StringIO("""<test xmlns:dt="urn:datatypes" dt:type="int"/>""")
74 input = libxml2.inputBuffer(f)
75 reader = input.newTextReader("test2")
79 print "Error reading test element"
81 if reader.GetAttributeNo(0) != "urn:datatypes" or \
82 reader.GetAttributeNo(1) != "int" or \
83 reader.GetAttributeNs("type", "urn:datatypes") != "int" or \
84 reader.GetAttribute("dt:type") != "int":
85 print "error reading test attributes"
89 # example from the XmlTextReader docs
91 f = StringIO.StringIO("""<root xmlns:a="urn:456">
96 input = libxml2.inputBuffer(f)
97 reader = input.newTextReader("test3")
101 if reader.Name() == "ref":
102 if reader.LookupNamespace("a") != "urn:456":
103 print "error resolving namespace prefix"
108 print "Error finding the ref element"
112 # Home made example for the various attribute access functions
114 f = StringIO.StringIO("""<testattr xmlns="urn:1" xmlns:a="urn:2" b="b" a:b="a:b"/>""")
115 input = libxml2.inputBuffer(f)
116 reader = input.newTextReader("test4")
119 print "Error reading the testattr element"
122 # Attribute exploration by index
124 if reader.MoveToAttributeNo(0) != 1:
125 print "Failed moveToAttribute(0)"
127 if reader.Value() != "urn:1":
128 print "Failed to read attribute(0)"
130 if reader.Name() != "xmlns":
131 print "Failed to read attribute(0) name"
133 if reader.MoveToAttributeNo(1) != 1:
134 print "Failed moveToAttribute(1)"
136 if reader.Value() != "urn:2":
137 print "Failed to read attribute(1)"
139 if reader.Name() != "xmlns:a":
140 print "Failed to read attribute(1) name"
142 if reader.MoveToAttributeNo(2) != 1:
143 print "Failed moveToAttribute(2)"
145 if reader.Value() != "b":
146 print "Failed to read attribute(2)"
148 if reader.Name() != "b":
149 print "Failed to read attribute(2) name"
151 if reader.MoveToAttributeNo(3) != 1:
152 print "Failed moveToAttribute(3)"
154 if reader.Value() != "a:b":
155 print "Failed to read attribute(3)"
157 if reader.Name() != "a:b":
158 print "Failed to read attribute(3) name"
161 # Attribute exploration by name
163 if reader.MoveToAttribute("xmlns") != 1:
164 print "Failed moveToAttribute('xmlns')"
166 if reader.Value() != "urn:1":
167 print "Failed to read attribute('xmlns')"
169 if reader.MoveToAttribute("xmlns:a") != 1:
170 print "Failed moveToAttribute('xmlns')"
172 if reader.Value() != "urn:2":
173 print "Failed to read attribute('xmlns:a')"
175 if reader.MoveToAttribute("b") != 1:
176 print "Failed moveToAttribute('b')"
178 if reader.Value() != "b":
179 print "Failed to read attribute('b')"
181 if reader.MoveToAttribute("a:b") != 1:
182 print "Failed moveToAttribute('a:b')"
184 if reader.Value() != "a:b":
185 print "Failed to read attribute('a:b')"
187 if reader.MoveToAttributeNs("b", "urn:2") != 1:
188 print "Failed moveToAttribute('b', 'urn:2')"
190 if reader.Value() != "a:b":
191 print "Failed to read attribute('b', 'urn:2')"
194 # Go back and read in sequence
196 if reader.MoveToElement() != 1:
197 print "Failed to move back to element"
199 if reader.MoveToFirstAttribute() != 1:
200 print "Failed to move to first attribute"
202 if reader.Value() != "urn:1":
203 print "Failed to read attribute(0)"
205 if reader.Name() != "xmlns":
206 print "Failed to read attribute(0) name"
208 if reader.MoveToNextAttribute() != 1:
209 print "Failed to move to next attribute"
211 if reader.Value() != "urn:2":
212 print "Failed to read attribute(1)"
214 if reader.Name() != "xmlns:a":
215 print "Failed to read attribute(1) name"
217 if reader.MoveToNextAttribute() != 1:
218 print "Failed to move to next attribute"
220 if reader.Value() != "b":
221 print "Failed to read attribute(2)"
223 if reader.Name() != "b":
224 print "Failed to read attribute(2) name"
226 if reader.MoveToNextAttribute() != 1:
227 print "Failed to move to next attribute"
229 if reader.Value() != "a:b":
230 print "Failed to read attribute(3)"
232 if reader.Name() != "a:b":
233 print "Failed to read attribute(3) name"
235 if reader.MoveToNextAttribute() != 0:
236 print "Failed to detect last attribute"
241 # a couple of tests for namespace nodes
243 f = StringIO.StringIO("""<a xmlns="http://example.com/foo"/>""")
244 input = libxml2.inputBuffer(f)
245 reader = input.newTextReader("test6")
248 print "test6: failed to Read()"
250 ret = reader.MoveToFirstAttribute()
252 print "test6: failed to MoveToFirstAttribute()"
254 if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \
255 reader.LocalName() != "xmlns" or reader.Name() != "xmlns" or \
256 reader.Value() != "http://example.com/foo" or reader.NodeType() != 2:
257 print "test6: failed to read the namespace node"
260 f = StringIO.StringIO("""<a xmlns:prefix="http://example.com/foo"/>""")
261 input = libxml2.inputBuffer(f)
262 reader = input.newTextReader("test7")
265 print "test7: failed to Read()"
267 ret = reader.MoveToFirstAttribute()
269 print "test7: failed to MoveToFirstAttribute()"
271 if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \
272 reader.LocalName() != "prefix" or reader.Name() != "xmlns:prefix" or \
273 reader.Value() != "http://example.com/foo" or reader.NodeType() != 2:
274 print "test7: failed to read the namespace node"
278 # Test for a limit case:
280 f = StringIO.StringIO("""<a/>""")
281 input = libxml2.inputBuffer(f)
282 reader = input.newTextReader("test8")
285 print "test8: failed to read the node"
287 if reader.Name() != "a" or reader.IsEmptyElement() != 1:
288 print "test8: failed to analyze the node"
292 print "test8: failed to detect the EOF"
296 # Another test provided by Stéphane Bidoul and checked with C#
299 f = StringIO.StringIO(s)
300 input = libxml2.inputBuffer(f)
301 reader = input.newTextReader("tst")
304 res=res + "%s (%s) [%s] %d %d\n" % (reader.NodeType(),reader.Name(),
305 reader.Value(), reader.IsEmptyElement(),
307 if reader.NodeType() == 1: # Element
308 while reader.MoveToNextAttribute():
309 res = res + "-- %s (%s) [%s] %d %d\n" % (reader.NodeType(),
310 reader.Name(),reader.Value(),
311 reader.IsEmptyElement(), reader.Depth())
314 doc="""<a><b b1="b1"/><c>content of c</c></a>"""
315 expect="""1 (a) [None] 0 0
319 3 (#text) [content of c] 0 2
323 res = tst_reader(doc)
329 doc="""<test><b/><c/></test>"""
330 expect="""1 (test) [None] 0 0
335 res = tst_reader(doc)
341 doc="""<a><b>bbb</b><c>ccc</c></a>"""
342 expect="""1 (a) [None] 0 0
351 res = tst_reader(doc)
353 print "test10 failed"
357 doc="""<test a="a"/>"""
358 expect="""1 (test) [None] 1 0
361 res = tst_reader(doc)
363 print "test11 failed"
367 doc="""<test><a>aaa</a><b/></test>"""
368 expect="""1 (test) [None] 0 0
375 res = tst_reader(doc)
377 print "test12 failed"
381 doc="""<test><p></p></test>"""
382 expect="""1 (test) [None] 0 0
387 res = tst_reader(doc)
389 print "test13 failed"
394 expect="""1 (p) [None] 0 0
397 res = tst_reader(doc)
399 print "test14 failed"
404 # test from bug #108801
406 doc="""<?xml version="1.0" standalone="no"?>
407 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
408 "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
412 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
415 expect="""10 (article) [None] 0 0
416 1 (article) [None] 0 0
418 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
420 15 (article) [None] 0 0
422 res = tst_reader(doc)
424 print "test15 failed"
429 # cleanup for memory allocation counting
435 # Memory debug specific
436 libxml2.cleanupParser()
437 if libxml2.debugMemory(1) == 0:
440 print "Memory leak %d bytes" % (libxml2.debugMemory(1))