(root)/
libxml2-2.12.3/
python/
tests/
reader.py
       1  #!/usr/bin/env python3
       2  # -*- coding: ISO-8859-1 -*-
       3  #
       4  # this tests the basic APIs of the XmlTextReader interface
       5  #
       6  import setup_test
       7  import libxml2
       8  import sys
       9  try:
      10      import StringIO
      11      str_io = StringIO.StringIO
      12  except:
      13      import io
      14      str_io = io.StringIO
      15  
      16  # Memory debug specific
      17  libxml2.debugMemory(1)
      18  
      19  f = str_io("""<a><b b1="b1"/><c>content of c</c></a>""")
      20  input = libxml2.inputBuffer(f)
      21  reader = input.newTextReader("test1")
      22  ret = reader.Read()
      23  if ret != 1:
      24      print("test1: Error reading to first element")
      25      sys.exit(1)
      26  if 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)
      30  ret = reader.Read()
      31  if ret != 1:
      32      print("test1: Error reading to second element")
      33      sys.exit(1)
      34  if 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)
      38  ret = reader.Read()
      39  if ret != 1:
      40      print("test1: Error reading to third element")
      41      sys.exit(1)
      42  if 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)
      46  ret = reader.Read()
      47  if ret != 1:
      48      print("test1: Error reading to text node")
      49      sys.exit(1)
      50  if 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)
      55  ret = reader.Read()
      56  if ret != 1:
      57      print("test1: Error reading to end of third element")
      58      sys.exit(1)
      59  if 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)
      63  ret = reader.Read()
      64  if ret != 1:
      65      print("test1: Error reading to end of first element")
      66      sys.exit(1)
      67  if 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)
      71  ret = reader.Read()
      72  if ret != 0:
      73      print("test1: Error reading to end of document")
      74      sys.exit(1)
      75  
      76  #
      77  # example from the XmlTextReader docs
      78  #
      79  f = str_io("""<test xmlns:dt="urn:datatypes" dt:type="int"/>""")
      80  input = libxml2.inputBuffer(f)
      81  reader = input.newTextReader("test2")
      82  
      83  ret = reader.Read()
      84  if ret != 1:
      85      print("Error reading test element")
      86      sys.exit(1)
      87  if 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  #
      97  f = str_io("""<root xmlns:a="urn:456">
      98  <item>
      99  <ref href="a:b"/>
     100  </item>
     101  </root>""")
     102  input = libxml2.inputBuffer(f)
     103  reader = input.newTextReader("test3")
     104  
     105  ret = reader.Read()
     106  while 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()
     113  if 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  #
     120  f = str_io("""<testattr xmlns="urn:1" xmlns:a="urn:2" b="b" a:b="a:b"/>""")
     121  input = libxml2.inputBuffer(f)
     122  reader = input.newTextReader("test4")
     123  ret = reader.Read()
     124  if ret != 1:
     125      print("Error reading the testattr element")
     126      sys.exit(1)
     127  #
     128  # Attribute exploration by index
     129  #
     130  if reader.MoveToAttributeNo(0) != 1:
     131      print("Failed moveToAttribute(0)")
     132      sys.exit(1)
     133  if reader.Value() != "urn:1":
     134      print("Failed to read attribute(0)")
     135      sys.exit(1)
     136  if reader.Name() != "xmlns":
     137      print("Failed to read attribute(0) name")
     138      sys.exit(1)
     139  if reader.MoveToAttributeNo(1) != 1:
     140      print("Failed moveToAttribute(1)")
     141      sys.exit(1)
     142  if reader.Value() != "urn:2":
     143      print("Failed to read attribute(1)")
     144      sys.exit(1)
     145  if reader.Name() != "xmlns:a":
     146      print("Failed to read attribute(1) name")
     147      sys.exit(1)
     148  if reader.MoveToAttributeNo(2) != 1:
     149      print("Failed moveToAttribute(2)")
     150      sys.exit(1)
     151  if reader.Value() != "b":
     152      print("Failed to read attribute(2)")
     153      sys.exit(1)
     154  if reader.Name() != "b":
     155      print("Failed to read attribute(2) name")
     156      sys.exit(1)
     157  if reader.MoveToAttributeNo(3) != 1:
     158      print("Failed moveToAttribute(3)")
     159      sys.exit(1)
     160  if reader.Value() != "a:b":
     161      print("Failed to read attribute(3)")
     162      sys.exit(1)
     163  if reader.Name() != "a:b":
     164      print("Failed to read attribute(3) name")
     165      sys.exit(1)
     166  #
     167  # Attribute exploration by name
     168  #
     169  if reader.MoveToAttribute("xmlns") != 1:
     170      print("Failed moveToAttribute('xmlns')")
     171      sys.exit(1)
     172  if reader.Value() != "urn:1":
     173      print("Failed to read attribute('xmlns')")
     174      sys.exit(1)
     175  if reader.MoveToAttribute("xmlns:a") != 1:
     176      print("Failed moveToAttribute('xmlns')")
     177      sys.exit(1)
     178  if reader.Value() != "urn:2":
     179      print("Failed to read attribute('xmlns:a')")
     180      sys.exit(1)
     181  if reader.MoveToAttribute("b") != 1:
     182      print("Failed moveToAttribute('b')")
     183      sys.exit(1)
     184  if reader.Value() != "b":
     185      print("Failed to read attribute('b')")
     186      sys.exit(1)
     187  if reader.MoveToAttribute("a:b") != 1:
     188      print("Failed moveToAttribute('a:b')")
     189      sys.exit(1)
     190  if reader.Value() != "a:b":
     191      print("Failed to read attribute('a:b')")
     192      sys.exit(1)
     193  if reader.MoveToAttributeNs("b", "urn:2") != 1:
     194      print("Failed moveToAttribute('b', 'urn:2')")
     195      sys.exit(1)
     196  if 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  #
     202  if reader.MoveToElement() != 1:
     203      print("Failed to move back to element")
     204      sys.exit(1)
     205  if reader.MoveToFirstAttribute() != 1:
     206      print("Failed to move to first attribute")
     207      sys.exit(1)
     208  if reader.Value() != "urn:1":
     209      print("Failed to read attribute(0)")
     210      sys.exit(1)
     211  if reader.Name() != "xmlns":
     212      print("Failed to read attribute(0) name")
     213      sys.exit(1)
     214  if reader.MoveToNextAttribute() != 1:
     215      print("Failed to move to next attribute")
     216      sys.exit(1)
     217  if reader.Value() != "urn:2":
     218      print("Failed to read attribute(1)")
     219      sys.exit(1)
     220  if reader.Name() != "xmlns:a":
     221      print("Failed to read attribute(1) name")
     222      sys.exit(1)
     223  if reader.MoveToNextAttribute() != 1:
     224      print("Failed to move to next attribute")
     225      sys.exit(1)
     226  if reader.Value() != "b":
     227      print("Failed to read attribute(2)")
     228      sys.exit(1)
     229  if reader.Name() != "b":
     230      print("Failed to read attribute(2) name")
     231      sys.exit(1)
     232  if reader.MoveToNextAttribute() != 1:
     233      print("Failed to move to next attribute")
     234      sys.exit(1)
     235  if reader.Value() != "a:b":
     236      print("Failed to read attribute(3)")
     237      sys.exit(1)
     238  if reader.Name() != "a:b":
     239      print("Failed to read attribute(3) name")
     240      sys.exit(1)
     241  if 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  #
     249  f = str_io("""<a xmlns="http://example.com/foo"/>""")
     250  input = libxml2.inputBuffer(f)
     251  reader = input.newTextReader("test6")
     252  ret = reader.Read()
     253  if ret != 1:
     254      print("test6: failed to Read()")
     255      sys.exit(1)
     256  ret = reader.MoveToFirstAttribute()
     257  if ret != 1:
     258      print("test6: failed to MoveToFirstAttribute()")
     259      sys.exit(1)
     260  if 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  
     266  f = str_io("""<a xmlns:prefix="http://example.com/foo"/>""")
     267  input = libxml2.inputBuffer(f)
     268  reader = input.newTextReader("test7")
     269  ret = reader.Read()
     270  if ret != 1:
     271      print("test7: failed to Read()")
     272      sys.exit(1)
     273  ret = reader.MoveToFirstAttribute()
     274  if ret != 1:
     275      print("test7: failed to MoveToFirstAttribute()")
     276      sys.exit(1)
     277  if 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  #
     286  f = str_io("""<a/>""")
     287  input = libxml2.inputBuffer(f)
     288  reader = input.newTextReader("test8")
     289  ret = reader.Read()
     290  if ret != 1:
     291      print("test8: failed to read the node")
     292      sys.exit(1)
     293  if reader.Name() != "a" or reader.IsEmptyElement() != 1:
     294      print("test8: failed to analyze the node")
     295      sys.exit(1)
     296  ret = reader.Read()
     297  if 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  #
     304  def 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      
     320  doc="""<a><b b1="b1"/><c>content of c</c></a>"""
     321  expect="""1 (a) [None] 0 0
     322  1 (b) [None] 1 1
     323  -- 2 (b1) [b1] 0 2
     324  1 (c) [None] 0 1
     325  3 (#text) [content of c] 0 2
     326  15 (c) [None] 0 1
     327  15 (a) [None] 0 0
     328  """
     329  res = tst_reader(doc)
     330  if res != expect:
     331      print("test5 failed")
     332      print(res)
     333      sys.exit(1)
     334  
     335  doc="""<test><b/><c/></test>"""
     336  expect="""1 (test) [None] 0 0
     337  1 (b) [None] 1 1
     338  1 (c) [None] 1 1
     339  15 (test) [None] 0 0
     340  """
     341  res = tst_reader(doc)
     342  if res != expect:
     343      print("test9 failed")
     344      print(res)
     345      sys.exit(1)
     346  
     347  doc="""<a><b>bbb</b><c>ccc</c></a>"""
     348  expect="""1 (a) [None] 0 0
     349  1 (b) [None] 0 1
     350  3 (#text) [bbb] 0 2
     351  15 (b) [None] 0 1
     352  1 (c) [None] 0 1
     353  3 (#text) [ccc] 0 2
     354  15 (c) [None] 0 1
     355  15 (a) [None] 0 0
     356  """
     357  res = tst_reader(doc)
     358  if res != expect:
     359      print("test10 failed")
     360      print(res)
     361      sys.exit(1)
     362  
     363  doc="""<test a="a"/>"""
     364  expect="""1 (test) [None] 1 0
     365  -- 2 (a) [a] 0 1
     366  """
     367  res = tst_reader(doc)
     368  if res != expect:
     369      print("test11 failed")
     370      print(res)
     371      sys.exit(1)
     372  
     373  doc="""<test><a>aaa</a><b/></test>"""
     374  expect="""1 (test) [None] 0 0
     375  1 (a) [None] 0 1
     376  3 (#text) [aaa] 0 2
     377  15 (a) [None] 0 1
     378  1 (b) [None] 1 1
     379  15 (test) [None] 0 0
     380  """
     381  res = tst_reader(doc)
     382  if res != expect:
     383      print("test12 failed")
     384      print(res)
     385      sys.exit(1)
     386  
     387  doc="""<test><p></p></test>"""
     388  expect="""1 (test) [None] 0 0
     389  1 (p) [None] 0 1
     390  15 (p) [None] 0 1
     391  15 (test) [None] 0 0
     392  """
     393  res = tst_reader(doc)
     394  if res != expect:
     395      print("test13 failed")
     396      print(res)
     397      sys.exit(1)
     398  
     399  doc="""<p></p>"""
     400  expect="""1 (p) [None] 0 0
     401  15 (p) [None] 0 0
     402  """
     403  res = tst_reader(doc)
     404  if res != expect:
     405      print("test14 failed")
     406      print(res)
     407      sys.exit(1)
     408  
     409  #
     410  # test from bug #108801 
     411  #
     412  doc="""<?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>
     418  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
     419  </article>
     420  """
     421  expect="""10 (article) [None] 0 0
     422  1 (article) [None] 0 0
     423  3 (#text) [
     424  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
     425  ] 0 1
     426  15 (article) [None] 0 0
     427  """
     428  res = tst_reader(doc)
     429  if res != expect:
     430      print("test15 failed")
     431      print(res)
     432      sys.exit(1)
     433  
     434  #
     435  # cleanup for memory allocation counting
     436  #
     437  del f
     438  del input
     439  del reader
     440  
     441  # Memory debug specific
     442  libxml2.cleanupParser()
     443  if libxml2.debugMemory(1) == 0:
     444      print("OK")
     445  else:
     446      print("Memory leak %d bytes" % (libxml2.debugMemory(1)))