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" encoding="iso-8859-1"?> 21 <schema xmlns = "http://www.w3.org/2001/XMLSchema"> 22 <element name = "Customer"> 23 <complexType> 24 <sequence> 25 <element name = "FirstName" type = "string" /> 26 <element name = "MiddleInitial" type = "string" /> 27 <element name = "LastName" type = "string" /> 28 </sequence> 29 <attribute name = "customerID" type = "integer" /> 30 </complexType> 31 </element> 32 </schema>""" 33 34 valid="""<?xml version="1.0" encoding="iso-8859-1"?> 35 <Customer customerID = "24332"> 36 <FirstName>Raymond</FirstName> 37 <MiddleInitial>G</MiddleInitial> 38 <LastName>Bayliss</LastName> 39 </Customer> 40 """ 41 42 invalid="""<?xml version="1.0" encoding="iso-8859-1"?> 43 <Customer customerID = "24332"> 44 <MiddleInitial>G</MiddleInitial> 45 <LastName>Bayliss</LastName> 46 </Customer> 47 """ 48 49 e = ErrorHandler() 50 ctxt_parser = libxml2.schemaNewMemParserCtxt(schema, len(schema)) 51 ctxt_schema = ctxt_parser.schemaParse() 52 ctxt_valid = ctxt_schema.schemaNewValidCtxt() 53 ctxt_valid.setValidityErrorHandler(e.handler, e.handler, ARG) 54 55 # Test valid document 56 doc = libxml2.parseDoc(valid) 57 ret = doc.schemaValidateDoc(ctxt_valid) 58 if ret != 0 or e.errors: 59 print("error doing schema validation") 60 sys.exit(1) 61 doc.freeDoc() 62 63 # Test invalid document 64 doc = libxml2.parseDoc(invalid) 65 ret = doc.schemaValidateDoc(ctxt_valid) 66 if ret == 0 or not e.errors: 67 print("Error: document supposer to be schema invalid") 68 sys.exit(1) 69 doc.freeDoc() 70 71 del ctxt_parser 72 del ctxt_schema 73 del ctxt_valid 74 libxml2.schemaCleanupTypes() 75 76 # Memory debug specific 77 libxml2.cleanupParser() 78 if libxml2.debugMemory(1) == 0: 79 print("OK") 80 else: 81 print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 82 libxml2.dumpMemory() 83 84