File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / python / tests / reader.py
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 19:53:34 2014 UTC (10 years, 5 months ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, HEAD
libxml2 2.9.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>