123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- #!/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("""<a><b b1="b1"/><c>content of c</c></a>""")
- 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("""<test xmlns:dt="urn:datatypes" dt:type="int"/>""")
- 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("""<root xmlns:a="urn:456">
- <item>
- <ref href="a:b"/>
- </item>
- </root>""")
- 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("""<testattr xmlns="urn:1" xmlns:a="urn:2" b="b" a:b="a:b"/>""")
- 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("""<a xmlns="http://example.com/foo"/>""")
- 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("""<a xmlns:prefix="http://example.com/foo"/>""")
- 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("""<a/>""")
- 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="""<a><b b1="b1"/><c>content of c</c></a>"""
- 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="""<test><b/><c/></test>"""
- 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="""<a><b>bbb</b><c>ccc</c></a>"""
- 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="""<test a="a"/>"""
- 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="""<test><a>aaa</a><b/></test>"""
- 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="""<test><p></p></test>"""
- 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="""<p></p>"""
- 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="""<?xml version="1.0" standalone="no"?>
- <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
- ]>
- <article>
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- </article>
- """
- 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()
|