Schema validation: Difference between revisions

From COLLADA Public Wiki
Jump to navigation Jump to search
SteveT (talk | contribs)
SteveT (talk | contribs)
Line 4: Line 4:
xmllint is a command-line application that can be used to validate an XML document against a W3C schema. xmllint is distributed as part of [http://xmlsoft.org/ libxml]. You can find binaries for Windows [http://www.zlatkovic.com/libxml.en.html here]. Most Linux distributions come with libxml already installed.
xmllint is a command-line application that can be used to validate an XML document against a W3C schema. xmllint is distributed as part of [http://xmlsoft.org/ libxml]. You can find binaries for Windows [http://www.zlatkovic.com/libxml.en.html here]. Most Linux distributions come with libxml already installed.


To validate the file duck.dae against the latest COLLADA 1.4.1 schema available from Khronos, run the following command:
To validate the file duck.dae against the latest COLLADA 1.4 schema available from Khronos, run the following command:
  xmllint --noout --schema http://www.khronos.org/files/collada_schema_1_4 duck.dae
  xmllint --noout --schema http://www.khronos.org/files/collada_schema_1_4 duck.dae



Revision as of 03:25, 25 May 2007

The COLLADA format is defined by a W3C schema. If a document doesn't conform to the schema then it isn't valid COLLADA data. This tutorial explains a few different ways to validate a COLLADA document against the schema.

Using xmllint

xmllint is a command-line application that can be used to validate an XML document against a W3C schema. xmllint is distributed as part of libxml. You can find binaries for Windows here. Most Linux distributions come with libxml already installed.

To validate the file duck.dae against the latest COLLADA 1.4 schema available from Khronos, run the following command:

xmllint --noout --schema http://www.khronos.org/files/collada_schema_1_4 duck.dae

You could also copy the schema locally and use your local version:

xmllint --noout --schema colladaSchema.xsd duck.dae

The --noout option prevents superfluous output. If the COLLADA document violates the schema, xmllint will print an error message.

Using libxml from a C/C++ Application

Using libxml you can validate a COLLADA document against the schema from a C/C++ application. The following code illustrates how it works.

#include "libxml/xmlschemas.h"

// libxml error handler
void schemaErrorCallback(void*, const char* message, ...) {
  va_list varArgs;
  va_start(varArgs, message);
  vfprintf(stdout, message, varArgs);
  va_end(varArgs);
}

// libxml warning handler
void schemaWarningCallback(void* callbackData, const char* message, ...) {
}

// Returns true if file validated successfully, false otherwise
bool validate(const string& uri) {
  bool result = false;
  if (xmlSchemaParserCtxt* schemaParser = 
      xmlSchemaNewParserCtxt("http://www.khronos.org/files/collada_schema_1_4")) {
    if (xmlSchema* schema = xmlSchemaParse(schemaParser)) {
      if (xmlSchemaValidCtxt* validityContext = xmlSchemaNewValidCtxt(schema)) {
        xmlSchemaSetValidErrors(validityContext,
                                schemaErrorCallback,
                                schemaWarningCallback,
                                /* callback data */ 0);

        // Returns 0 if validation succeeded
        result = xmlSchemaValidateFile(validityContext, uri.c_str(), 0) == 0;
        xmlSchemaFreeValidCtxt(validityContext);
      }
      xmlSchemaFree(schema);
    }
    xmlSchemaFreeParserCtxt(schemaParser);
  }

  return result;
}