#!/usr/bin/python -u # -*- coding: ISO-8859-1 -*- # # this tests the basic APIs of the XmlTextReader interface # import libxml2 import StringIO import sys # Memory debug specific libxml2.debugMemory(1) f = StringIO.StringIO("""content of c""") input = libxml2.inputBuffer(f) reader = input.newTextReader("test1") ret = reader.Read() if ret != 1: print "test1: Error reading to first element" sys.exit(1) if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \ reader.NodeType() != 1 or reader.HasAttributes() != 0: print "test1: Error reading the first element" sys.exit(1) ret = reader.Read() if ret != 1: print "test1: Error reading to second element" sys.exit(1) if reader.Name() != "b" or reader.IsEmptyElement() != 1 or \ reader.NodeType() != 1 or reader.HasAttributes() != 1: print "test1: Error reading the second element" sys.exit(1) ret = reader.Read() if ret != 1: print "test1: Error reading to third element" sys.exit(1) if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \ reader.NodeType() != 1 or reader.HasAttributes() != 0: print "test1: Error reading the third element" sys.exit(1) ret = reader.Read() if ret != 1: print "test1: Error reading to text node" sys.exit(1) if reader.Name() != "#text" or reader.IsEmptyElement() != 0 or \ reader.NodeType() != 3 or reader.HasAttributes() != 0 or \ reader.Value() != "content of c": print "test1: Error reading the text node" sys.exit(1) ret = reader.Read() if ret != 1: print "test1: Error reading to end of third element" sys.exit(1) if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \ reader.NodeType() != 15 or reader.HasAttributes() != 0: print "test1: Error reading the end of third element" sys.exit(1) ret = reader.Read() if ret != 1: print "test1: Error reading to end of first element" sys.exit(1) if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \ reader.NodeType() != 15 or reader.HasAttributes() != 0: print "test1: Error reading the end of first element" sys.exit(1) ret = reader.Read() if ret != 0: print "test1: Error reading to end of document" sys.exit(1) # # example from the XmlTextReader docs # f = StringIO.StringIO("""""") input = libxml2.inputBuffer(f) reader = input.newTextReader("test2") ret = reader.Read() if ret != 1: print "Error reading test element" sys.exit(1) if reader.GetAttributeNo(0) != "urn:datatypes" or \ reader.GetAttributeNo(1) != "int" or \ reader.GetAttributeNs("type", "urn:datatypes") != "int" or \ reader.GetAttribute("dt:type") != "int": print "error reading test attributes" sys.exit(1) # # example from the XmlTextReader docs # f = StringIO.StringIO(""" """) input = libxml2.inputBuffer(f) reader = input.newTextReader("test3") ret = reader.Read() while ret == 1: if reader.Name() == "ref": if reader.LookupNamespace("a") != "urn:456": print "error resolving namespace prefix" sys.exit(1) break ret = reader.Read() if ret != 1: print "Error finding the ref element" sys.exit(1) # # Home made example for the various attribute access functions # f = StringIO.StringIO("""""") input = libxml2.inputBuffer(f) reader = input.newTextReader("test4") ret = reader.Read() if ret != 1: print "Error reading the testattr element" sys.exit(1) # # Attribute exploration by index # if reader.MoveToAttributeNo(0) != 1: print "Failed moveToAttribute(0)" sys.exit(1) if reader.Value() != "urn:1": print "Failed to read attribute(0)" sys.exit(1) if reader.Name() != "xmlns": print "Failed to read attribute(0) name" sys.exit(1) if reader.MoveToAttributeNo(1) != 1: print "Failed moveToAttribute(1)" sys.exit(1) if reader.Value() != "urn:2": print "Failed to read attribute(1)" sys.exit(1) if reader.Name() != "xmlns:a": print "Failed to read attribute(1) name" sys.exit(1) if reader.MoveToAttributeNo(2) != 1: print "Failed moveToAttribute(2)" sys.exit(1) if reader.Value() != "b": print "Failed to read attribute(2)" sys.exit(1) if reader.Name() != "b": print "Failed to read attribute(2) name" sys.exit(1) if reader.MoveToAttributeNo(3) != 1: print "Failed moveToAttribute(3)" sys.exit(1) if reader.Value() != "a:b": print "Failed to read attribute(3)" sys.exit(1) if reader.Name() != "a:b": print "Failed to read attribute(3) name" sys.exit(1) # # Attribute exploration by name # if reader.MoveToAttribute("xmlns") != 1: print "Failed moveToAttribute('xmlns')" sys.exit(1) if reader.Value() != "urn:1": print "Failed to read attribute('xmlns')" sys.exit(1) if reader.MoveToAttribute("xmlns:a") != 1: print "Failed moveToAttribute('xmlns')" sys.exit(1) if reader.Value() != "urn:2": print "Failed to read attribute('xmlns:a')" sys.exit(1) if reader.MoveToAttribute("b") != 1: print "Failed moveToAttribute('b')" sys.exit(1) if reader.Value() != "b": print "Failed to read attribute('b')" sys.exit(1) if reader.MoveToAttribute("a:b") != 1: print "Failed moveToAttribute('a:b')" sys.exit(1) if reader.Value() != "a:b": print "Failed to read attribute('a:b')" sys.exit(1) if reader.MoveToAttributeNs("b", "urn:2") != 1: print "Failed moveToAttribute('b', 'urn:2')" sys.exit(1) if reader.Value() != "a:b": print "Failed to read attribute('b', 'urn:2')" sys.exit(1) # # Go back and read in sequence # if reader.MoveToElement() != 1: print "Failed to move back to element" sys.exit(1) if reader.MoveToFirstAttribute() != 1: print "Failed to move to first attribute" sys.exit(1) if reader.Value() != "urn:1": print "Failed to read attribute(0)" sys.exit(1) if reader.Name() != "xmlns": print "Failed to read attribute(0) name" sys.exit(1) if reader.MoveToNextAttribute() != 1: print "Failed to move to next attribute" sys.exit(1) if reader.Value() != "urn:2": print "Failed to read attribute(1)" sys.exit(1) if reader.Name() != "xmlns:a": print "Failed to read attribute(1) name" sys.exit(1) if reader.MoveToNextAttribute() != 1: print "Failed to move to next attribute" sys.exit(1) if reader.Value() != "b": print "Failed to read attribute(2)" sys.exit(1) if reader.Name() != "b": print "Failed to read attribute(2) name" sys.exit(1) if reader.MoveToNextAttribute() != 1: print "Failed to move to next attribute" sys.exit(1) if reader.Value() != "a:b": print "Failed to read attribute(3)" sys.exit(1) if reader.Name() != "a:b": print "Failed to read attribute(3) name" sys.exit(1) if reader.MoveToNextAttribute() != 0: print "Failed to detect last attribute" sys.exit(1) # # a couple of tests for namespace nodes # f = StringIO.StringIO("""""") input = libxml2.inputBuffer(f) reader = input.newTextReader("test6") ret = reader.Read() if ret != 1: print "test6: failed to Read()" sys.exit(1) ret = reader.MoveToFirstAttribute() if ret != 1: print "test6: failed to MoveToFirstAttribute()" sys.exit(1) if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \ reader.LocalName() != "xmlns" or reader.Name() != "xmlns" or \ reader.Value() != "http://example.com/foo" or reader.NodeType() != 2: print "test6: failed to read the namespace node" sys.exit(1) f = StringIO.StringIO("""""") input = libxml2.inputBuffer(f) reader = input.newTextReader("test7") ret = reader.Read() if ret != 1: print "test7: failed to Read()" sys.exit(1) ret = reader.MoveToFirstAttribute() if ret != 1: print "test7: failed to MoveToFirstAttribute()" sys.exit(1) if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \ reader.LocalName() != "prefix" or reader.Name() != "xmlns:prefix" or \ reader.Value() != "http://example.com/foo" or reader.NodeType() != 2: print "test7: failed to read the namespace node" sys.exit(1) # # Test for a limit case: # f = StringIO.StringIO("""""") input = libxml2.inputBuffer(f) reader = input.newTextReader("test8") ret = reader.Read() if ret != 1: print "test8: failed to read the node" sys.exit(1) if reader.Name() != "a" or reader.IsEmptyElement() != 1: print "test8: failed to analyze the node" sys.exit(1) ret = reader.Read() if ret != 0: print "test8: failed to detect the EOF" sys.exit(1) # # Another test provided by Stéphane Bidoul and checked with C# # def tst_reader(s): f = StringIO.StringIO(s) input = libxml2.inputBuffer(f) reader = input.newTextReader("tst") res = "" while reader.Read(): res=res + "%s (%s) [%s] %d %d\n" % (reader.NodeType(),reader.Name(), reader.Value(), reader.IsEmptyElement(), reader.Depth()) if reader.NodeType() == 1: # Element while reader.MoveToNextAttribute(): res = res + "-- %s (%s) [%s] %d %d\n" % (reader.NodeType(), reader.Name(),reader.Value(), reader.IsEmptyElement(), reader.Depth()) return res doc="""content of c""" expect="""1 (a) [None] 0 0 1 (b) [None] 1 1 -- 2 (b1) [b1] 0 2 1 (c) [None] 0 1 3 (#text) [content of c] 0 2 15 (c) [None] 0 1 15 (a) [None] 0 0 """ res = tst_reader(doc) if res != expect: print "test5 failed" print res sys.exit(1) doc="""""" expect="""1 (test) [None] 0 0 1 (b) [None] 1 1 1 (c) [None] 1 1 15 (test) [None] 0 0 """ res = tst_reader(doc) if res != expect: print "test9 failed" print res sys.exit(1) doc="""bbbccc""" expect="""1 (a) [None] 0 0 1 (b) [None] 0 1 3 (#text) [bbb] 0 2 15 (b) [None] 0 1 1 (c) [None] 0 1 3 (#text) [ccc] 0 2 15 (c) [None] 0 1 15 (a) [None] 0 0 """ res = tst_reader(doc) if res != expect: print "test10 failed" print res sys.exit(1) doc="""""" expect="""1 (test) [None] 1 0 -- 2 (a) [a] 0 1 """ res = tst_reader(doc) if res != expect: print "test11 failed" print res sys.exit(1) doc="""aaa""" expect="""1 (test) [None] 0 0 1 (a) [None] 0 1 3 (#text) [aaa] 0 2 15 (a) [None] 0 1 1 (b) [None] 1 1 15 (test) [None] 0 0 """ res = tst_reader(doc) if res != expect: print "test12 failed" print res sys.exit(1) doc="""

""" expect="""1 (test) [None] 0 0 1 (p) [None] 0 1 15 (p) [None] 0 1 15 (test) [None] 0 0 """ res = tst_reader(doc) if res != expect: print "test13 failed" print res sys.exit(1) doc="""

""" expect="""1 (p) [None] 0 0 15 (p) [None] 0 0 """ res = tst_reader(doc) if res != expect: print "test14 failed" print res sys.exit(1) # # test from bug #108801 # doc="""
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
""" expect="""10 (article) [None] 0 0 1 (article) [None] 0 0 3 (#text) [ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ] 0 1 15 (article) [None] 0 0 """ res = tst_reader(doc) if res != expect: print "test15 failed" print res sys.exit(1) # # cleanup for memory allocation counting # del f del input del reader # Memory debug specific libxml2.cleanupParser() if libxml2.debugMemory(1) == 0: print "OK" else: print "Memory leak %d bytes" % (libxml2.debugMemory(1)) libxml2.dumpMemory()