1.1 --- a/libxml2dom/macrolib/macrolib.py Sun Aug 31 01:31:31 2008 +0200
1.2 +++ b/libxml2dom/macrolib/macrolib.py Sun Aug 31 02:36:03 2008 +0200
1.3 @@ -736,14 +736,43 @@
1.4 libxml2mod.xmlParseDocument(context)
1.5
1.6 # Schema and validation helper functions and classes.
1.7 +# NOTE: Should potentially combine these with other definitions.
1.8
1.9 -def Document_schema(doc):
1.10 - return Schema_parse(libxml2mod.xmlRelaxNGNewDocParserCtxt(doc))
1.11 +RELAXNG_NS = "http://relaxng.org/ns/structure/1.0"
1.12 +SCHEMATRON_NS = "http://purl.oclc.org/dsdl/schematron"
1.13 +XMLSCHEMA_NS = "http://www.w3.org/2001/XMLSchema"
1.14 +
1.15 +def Document_schema(doc, namespaceURI):
1.16 + if namespaceURI == RELAXNG_NS:
1.17 + return Schema_parseRelaxNG(libxml2mod.xmlRelaxNGNewDocParserCtxt(doc))
1.18 + elif namespaceURI == SCHEMATRON_NS:
1.19 + return Schema_parseSchematron(libxml2mod.xmlSchematronNewDocParserCtxt(doc))
1.20 + elif namespaceURI == XMLSCHEMA_NS:
1.21 + return Schema_parseSchema(libxml2mod.xmlSchemaNewDocParserCtxt(doc))
1.22 + else:
1.23 + return None
1.24
1.25 -def Document_schemaFromString(s):
1.26 - return Schema_parse(libxml2mod.xmlRelaxNGNewMemParserCtxt(s, len(s)))
1.27 +def Document_schemaFromString(s, namespaceURI):
1.28 + if namespaceURI == RELAXNG_NS:
1.29 + return Schema_parseRelaxNG(libxml2mod.xmlRelaxNGNewMemParserCtxt(s, len(s)))
1.30 + elif namespaceURI == SCHEMATRON_NS:
1.31 + return Schema_parseSchematron(libxml2mod.xmlSchematronNewMemParserCtxt(s, len(s)))
1.32 + elif namespaceURI == XMLSCHEMA_NS:
1.33 + return Schema_parseSchema(libxml2mod.xmlSchemaNewMemParserCtxt(s, len(s)))
1.34 + else:
1.35 + return None
1.36
1.37 -def Document_validate(schema, doc, error_handler):
1.38 +def Document_validate(schema, doc, error_handler, namespaceURI):
1.39 + if namespaceURI == RELAXNG_NS:
1.40 + return Document_validateRelaxNG(schema, doc, error_handler)
1.41 + elif namespaceURI == SCHEMATRON_NS:
1.42 + return Document_validateSchematron(schema, doc, error_handler)
1.43 + elif namespaceURI == XMLSCHEMA_NS:
1.44 + return Document_validateSchema(schema, doc, error_handler)
1.45 + else:
1.46 + return 0
1.47 +
1.48 +def Document_validateRelaxNG(schema, doc, error_handler):
1.49 validator_context = libxml2mod.xmlRelaxNGNewValidCtxt(schema)
1.50 handler = ValidationHandler(error_handler)
1.51 libxml2mod.xmlRelaxNGSetValidErrors(validator_context, handler.error, handler.warning, None)
1.52 @@ -753,14 +782,51 @@
1.53 finally:
1.54 libxml2mod.xmlRelaxNGFreeValidCtxt(validator_context)
1.55
1.56 -def Schema_parse(context):
1.57 +def Document_validateSchematron(schema, doc, error_handler):
1.58 + validator_context = libxml2mod.xmlSchematronNewValidCtxt(schema)
1.59 + handler = ValidationHandler(error_handler)
1.60 + libxml2mod.xmlSchematronSetValidErrors(validator_context, handler.error, handler.warning, None)
1.61 + try:
1.62 + status = libxml2mod.xmlSchematronValidateDoc(validator_context, doc)
1.63 + return status == 0
1.64 + finally:
1.65 + libxml2mod.xmlSchematronFreeValidCtxt(validator_context)
1.66 +
1.67 +def Document_validateSchema(schema, doc, error_handler):
1.68 + validator_context = libxml2mod.xmlSchemaNewValidCtxt(schema)
1.69 + handler = ValidationHandler(error_handler)
1.70 + libxml2mod.xmlSchemaSetValidErrors(validator_context, handler.error, handler.warning, None)
1.71 + try:
1.72 + status = libxml2mod.xmlSchemaValidateDoc(validator_context, doc)
1.73 + return status == 0
1.74 + finally:
1.75 + libxml2mod.xmlSchemaFreeValidCtxt(validator_context)
1.76 +
1.77 +def Schema_parseRelaxNG(context):
1.78 try:
1.79 return libxml2mod.xmlRelaxNGParse(context)
1.80 finally:
1.81 libxml2mod.xmlRelaxNGFreeParserCtxt(context)
1.82
1.83 -def Schema_free(schema):
1.84 - libxml2mod.xmlRelaxNGFree(schema)
1.85 +def Schema_parseSchematron(context):
1.86 + try:
1.87 + return libxml2mod.xmlSchematronParse(context)
1.88 + finally:
1.89 + libxml2mod.xmlSchematronFreeParserCtxt(context)
1.90 +
1.91 +def Schema_parseSchema(context):
1.92 + try:
1.93 + return libxml2mod.xmlSchemaParse(context)
1.94 + finally:
1.95 + libxml2mod.xmlSchemaFreeParserCtxt(context)
1.96 +
1.97 +def Schema_free(schema, namespaceURI):
1.98 + if namespaceURI == RELAXNG_NS:
1.99 + libxml2mod.xmlRelaxNGFree(schema)
1.100 + elif namespaceURI == SCHEMATRON_NS:
1.101 + libxml2mod.xmlSchematronFree(schema)
1.102 + elif namespaceURI == XMLSCHEMA_NS:
1.103 + libxml2mod.xmlSchemaFree(schema)
1.104
1.105 class ValidationHandler:
1.106