1 #!/usr/bin/python -u 2 import libxml2 3 import sys 4 5 ARG = 'test string' 6 7 class ErrorHandler: 8 9 def __init__(self): 10 self.errors = [] 11 12 def handler(self, msg, data): 13 if data != ARG: 14 raise Exception("Error handler did not receive correct argument") 15 self.errors.append(msg) 16 17 # Memory debug specific 18 libxml2.debugMemory(1) 19 20 schema="""<?xml version="1.0"?> 21 <element name="foo" 22 xmlns="http://relaxng.org/ns/structure/1.0" 23 xmlns:a="http://relaxng.org/ns/annotation/1.0" 24 xmlns:ex1="http://www.example.com/n1" 25 xmlns:ex2="http://www.example.com/n2"> 26 <a:documentation>A foo element.</a:documentation> 27 <element name="ex1:bar1"> 28 <empty/> 29 </element> 30 <element name="ex2:bar2"> 31 <empty/> 32 </element> 33 </element> 34 """ 35 36 valid="""<?xml version="1.0"?> 37 <foo><pre1:bar1 xmlns:pre1="http://www.example.com/n1"/><pre2:bar2 xmlns:pre2="http://www.example.com/n2"/></foo>""" 38 39 invalid="""<?xml version="1.0"?> 40 <foo><pre1:bar1 xmlns:pre1="http://www.example.com/n1">bad</pre1:bar1><pre2:bar2 xmlns:pre2="http://www.example.com/n2"/></foo>""" 41 42 rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) 43 rngs = rngp.relaxNGParse() 44 ctxt = rngs.relaxNGNewValidCtxt() 45 e = ErrorHandler() 46 ctxt.setValidityErrorHandler(e.handler, e.handler, ARG) 47 48 # Test valid document 49 doc = libxml2.parseDoc(valid) 50 ret = doc.relaxNGValidateDoc(ctxt) 51 if ret != 0 or e.errors: 52 print("error doing RelaxNG validation") 53 sys.exit(1) 54 doc.freeDoc() 55 56 # Test invalid document 57 doc = libxml2.parseDoc(invalid) 58 ret = doc.relaxNGValidateDoc(ctxt) 59 if ret == 0 or not e.errors: 60 print("Error: document supposed to be RelaxNG invalid") 61 sys.exit(1) 62 doc.freeDoc() 63 64 del rngp 65 del rngs 66 del ctxt 67 libxml2.relaxNGCleanupTypes() 68 69 # Memory debug specific 70 libxml2.cleanupParser() 71 if libxml2.debugMemory(1) == 0: 72 print("OK") 73 else: 74 print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 75 libxml2.dumpMemory() 76 77