home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / share / doc / python-libxml2 / examples / reader.py < prev    next >
Encoding:
Python Source  |  2004-02-23  |  12.1 KB  |  442 lines

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