Validation from C++

The SaxonC C++ interface allows schemas to be loaded into a SaxonProcessor, and then to be used for validating instances, or for schema-aware XSLT and XQuery processing.

The main steps are:

  1. Create a SaxonProcessor using the constructor new SaxonProcessor(true). (Note that schema processing requires SaxonC-EE).

  2. Call the newXsdCompiler() method to get an XsdCompiler. It is possible to get multiple schema compilers, or to use a single schema compiler to compile multiple schemas.

  3. If required, set options on the XsdCompiler to control the way in which schema documents will be loaded. It is possible to set the XSD version (to 1.0 or 1.1).

  4. Construct an XsdSchema object, representing a compiled schema, by calling one of the compile methods (which enable compiling from lexical string, XdmNode object or file). The resulting schema document is available to all applications run within the containing SaxonProcessor.

  5. To validate an instance document, first call the newValidator() method on the XsdSchema object. This returns a SchemaValidator.

  6. Set options on the SchemaValidator to control the way in which a particular validation episode is performed, and then invoke its validate() or validateToNode() method to validate an instance document. Options available include the ability to control whether additional schema components can be referenced from the instance document using xsi:schemaLocation attributes.

  7. Validation errors are returned to the standard error listener. It is also possible to call the method getValidationReport() to return a validator report as an XdmNode object.

  8. It is possible to save a compiled schema in an SCM (schema component model) file using the exportComponents() method on the XsdSchema object, and to import a previously-saved schema by calling importComponents() on the XsdCompiler object.

  9. If the schema is to be imported into a schema-aware XSLT stylesheet, XQuery, or XPath expression, it can be supplied to the relevant Xslt30Processor, XQueryProcessor, or XPathProcessor via its useSchema() method.

Note that additional schemas referenced from the xsi:schemaLocation attributes within the source documents will be loaded as necessary. By default a target namespace is ignored if there is already a loaded schema for that namespace; Saxon makes no attempt to load multiple schemas for the same namespace and check them for consistency. This behaviour can be changed using the configuration option MULTIPLE_SCHEMA_IMPORTS.

Unlike Saxon versions prior to Saxon 13, compiling a schema does not make it globally available to all applications using a given SaxonProcessor. Each compiled schema is distinct and can be used individually without interfering with other schemas. However, all the schemas used within a SaxonProcessor must be consistent. Consistency is defined in the version 4.0 language specifications: in simplified terms, it means that the same name must not be used in different schemas to refer to different element or type declarations.

The SchemaValidator can be used with the DocumentBuilder class to parse and validate XML documents.