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