3 # this tests the basic APIs of the XmlTextReader interface
9 # Memory debug specific
10 libxml2.debugMemory(1)
12 f = StringIO.StringIO("""<a><b b1="b1"/><c>content of c</c></a>""")
13 input = libxml2.inputBuffer(f)
14 reader = input.newTextReader("test1")
17 print "test1: Error reading to first element"
19 if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \
20 reader.NodeType() != 1 or reader.HasAttributes() != 0:
21 print "test1: Error reading the first element"
25 print "test1: Error reading to second element"
27 if reader.Name() != "b" or reader.IsEmptyElement() != 1 or \
28 reader.NodeType() != 1 or reader.HasAttributes() != 1:
29 print "test1: Error reading the second element"
33 print "test1: Error reading to third element"
35 if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \
36 reader.NodeType() != 1 or reader.HasAttributes() != 0:
37 print "test1: Error reading the third element"
41 print "test1: Error reading to text node"
43 if 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"
50 print "test1: Error reading to end of third element"
52 if 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"
58 print "test1: Error reading to end of first element"
60 if 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"
66 print "test1: Error reading to end of document"
70 # example from the XmlTextReader docs
72 f = StringIO.StringIO("""<test xmlns:dt="urn:datatypes" dt:type="int"/>""")
73 input = libxml2.inputBuffer(f)
74 reader = input.newTextReader("test2")
78 print "Error reading test element"
80 if 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"
88 # example from the XmlTextReader docs
90 f = StringIO.StringIO("""<root xmlns:a="urn:456">
95 input = libxml2.inputBuffer(f)
96 reader = input.newTextReader("test3")
100 if reader.Name() == "ref":
101 if reader.LookupNamespace("a") != "urn:456":
102 print "error resolving namespace prefix"
107 print "Error finding the ref element"
111 # Home made example for the various attribute access functions
113 f = StringIO.StringIO("""<testattr xmlns="urn:1" xmlns:a="urn:2" b="b" a:b="a:b"/>""")
114 input = libxml2.inputBuffer(f)
115 reader = input.newTextReader("test4")
118 print "Error reading the testattr element"
121 # Attribute exploration by index
123 if reader.MoveToAttributeNo(0) != 1:
124 print "Failed moveToAttribute(0)"
126 if reader.Value() != "urn:1":
127 print "Failed to read attribute(0)"
129 if reader.Name() != "xmlns":
130 print "Failed to read attribute(0) name"
132 if reader.MoveToAttributeNo(1) != 1:
133 print "Failed moveToAttribute(1)"
135 if reader.Value() != "urn:2":
136 print "Failed to read attribute(1)"
138 if reader.Name() != "xmlns:a":
139 print "Failed to read attribute(1) name"
141 if reader.MoveToAttributeNo(2) != 1:
142 print "Failed moveToAttribute(2)"
144 if reader.Value() != "b":
145 print "Failed to read attribute(2)"
147 if reader.Name() != "b":
148 print "Failed to read attribute(2) name"
150 if reader.MoveToAttributeNo(3) != 1:
151 print "Failed moveToAttribute(3)"
153 if reader.Value() != "a:b":
154 print "Failed to read attribute(3)"
156 if reader.Name() != "a:b":
157 print "Failed to read attribute(3) name"
160 # Attribute exploration by name
162 if reader.MoveToAttribute("xmlns") != 1:
163 print "Failed moveToAttribute('xmlns')"
165 if reader.Value() != "urn:1":
166 print "Failed to read attribute('xmlns')"
168 if reader.MoveToAttribute("xmlns:a") != 1:
169 print "Failed moveToAttribute('xmlns')"
171 if reader.Value() != "urn:2":
172 print "Failed to read attribute('xmlns:a')"
174 if reader.MoveToAttribute("b") != 1:
175 print "Failed moveToAttribute('b')"
177 if reader.Value() != "b":
178 print "Failed to read attribute('b')"
180 if reader.MoveToAttribute("a:b") != 1:
181 print "Failed moveToAttribute('a:b')"
183 if reader.Value() != "a:b":
184 print "Failed to read attribute('a:b')"
186 if reader.MoveToAttributeNs("b", "urn:2") != 1:
187 print "Failed moveToAttribute('b', 'urn:2')"
189 if reader.Value() != "a:b":
190 print "Failed to read attribute('b', 'urn:2')"
193 # Go back and read in sequence
195 if reader.MoveToElement() != 1:
196 print "Failed to move back to element"
198 if reader.MoveToFirstAttribute() != 1:
199 print "Failed to move to first attribute"
201 if reader.Value() != "urn:1":
202 print "Failed to read attribute(0)"
204 if reader.Name() != "xmlns":
205 print "Failed to read attribute(0) name"
207 if reader.MoveToNextAttribute() != 1:
208 print "Failed to move to next attribute"
210 if reader.Value() != "urn:2":
211 print "Failed to read attribute(1)"
213 if reader.Name() != "xmlns:a":
214 print "Failed to read attribute(1) name"
216 if reader.MoveToNextAttribute() != 1:
217 print "Failed to move to next attribute"
219 if reader.Value() != "b":
220 print "Failed to read attribute(2)"
222 if reader.Name() != "b":
223 print "Failed to read attribute(2) name"
225 if reader.MoveToNextAttribute() != 1:
226 print "Failed to move to next attribute"
228 if reader.Value() != "a:b":
229 print "Failed to read attribute(3)"
231 if reader.Name() != "a:b":
232 print "Failed to read attribute(3) name"
234 if reader.MoveToNextAttribute() != 0:
235 print "Failed to detect last attribute"
240 # a couple of tests for namespace nodes
242 f = StringIO.StringIO("""<a xmlns="http://example.com/foo"/>""")
243 input = libxml2.inputBuffer(f)
244 reader = input.newTextReader("test6")
247 print "test6: failed to Read()"
249 ret = reader.MoveToFirstAttribute()
251 print "test6: failed to MoveToFirstAttribute()"
253 if 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"
259 f = StringIO.StringIO("""<a xmlns:prefix="http://example.com/foo"/>""")
260 input = libxml2.inputBuffer(f)
261 reader = input.newTextReader("test7")
264 print "test7: failed to Read()"
266 ret = reader.MoveToFirstAttribute()
268 print "test7: failed to MoveToFirstAttribute()"
270 if 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"
277 # Test for a limit case:
279 f = StringIO.StringIO("""<a/>""")
280 input = libxml2.inputBuffer(f)
281 reader = input.newTextReader("test8")
284 print "test8: failed to read the node"
286 if reader.Name() != "a" or reader.IsEmptyElement() != 1:
287 print "test8: failed to analyze the node"
291 print "test8: failed to detect the EOF"
295 # Another test provided by Stéphane Bidoul and checked with C#
298 f = StringIO.StringIO(s)
299 input = libxml2.inputBuffer(f)
300 reader = input.newTextReader("tst")
303 res=res + "%s (%s) [%s] %d %d\n" % (reader.NodeType(),reader.Name(),
304 reader.Value(), reader.IsEmptyElement(),
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())
313 doc="""<a><b b1="b1"/><c>content of c</c></a>"""
314 expect="""1 (a) [None] 0 0
318 3 (#text) [content of c] 0 2
322 res = tst_reader(doc)
328 doc="""<test><b/><c/></test>"""
329 expect="""1 (test) [None] 0 0
334 res = tst_reader(doc)
340 doc="""<a><b>bbb</b><c>ccc</c></a>"""
341 expect="""1 (a) [None] 0 0
350 res = tst_reader(doc)
352 print "test10 failed"
356 doc="""<test a="a"/>"""
357 expect="""1 (test) [None] 1 0
360 res = tst_reader(doc)
362 print "test11 failed"
366 doc="""<test><a>aaa</a><b/></test>"""
367 expect="""1 (test) [None] 0 0
374 res = tst_reader(doc)
376 print "test12 failed"
380 doc="""<test><p></p></test>"""
381 expect="""1 (test) [None] 0 0
386 res = tst_reader(doc)
388 print "test13 failed"
393 expect="""1 (p) [None] 0 0
396 res = tst_reader(doc)
398 print "test14 failed"
403 # test from bug #108801
405 doc="""<?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" [
411 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
414 expect="""10 (article) [None] 0 0
415 1 (article) [None] 0 0
417 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
419 15 (article) [None] 0 0
421 res = tst_reader(doc)
423 print "test15 failed"
428 # cleanup for memory allocation counting
434 # Memory debug specific
435 libxml2.cleanupParser()
436 if libxml2.debugMemory(1) == 0:
439 print "Memory leak %d bytes" % (libxml2.debugMemory(1))