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