Schema validation: Difference between revisions

From COLLADA Public Wiki
Jump to navigation Jump to search
SteveT (talk | contribs)
No edit summary
 
Fixed link to Khronos
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
Stub for schema validation article.
{{tutorials}}


[[Category:Tutorials]]
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 [[COLLADA schema]]'''.
 
==Using xmllint==
<code>xmllint</code> is a command-line application that can be used to validate an XML document against a W3C schema. <code>xmllint</code> is distributed as part of <code>[http://xmlsoft.org/ libxml]</code>. You can find binaries for Windows [http://www.zlatkovic.com/libxml.en.html here]. Mac OS X and most Linux distributions come with <code>libxml</code> already installed.
 
To validate the COLLADA document <code>duck.dae</code> against the latest COLLADA 1.4 schema available from [https://www.khronos.org/collada Khronos], run the following command:
xmllint --noout --schema <nowiki>http://www.khronos.org/files/collada_schema_1_4_1.xsd</nowiki> duck.dae
 
You could also copy the schema locally and use your local version:
xmllint --noout --schema colladaSchema.xsd duck.dae
 
The <code>--noout</code> option prevents superfluous output. If the COLLADA document violates the schema, <code>xmllint</code> outputs an error message.
 
==Using libxml from a C/C++ Application==
Using <code>libxml</code>, 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("<nowiki>http://www.khronos.org/files/collada_schema_1_4_1.xsd</nowiki>")) {
    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;
}
 
[[Category:COLLADA tutorials]]

Latest revision as of 15:23, 26 July 2012

Tutorials
This article is one several tutorials, guides, and annotated examples available in this wiki.
Multipage tutorials:  • COLLADA DOM user guide
Shorter how-tos:  • Using accessors  • Schema validation • Using URIs
 • Various annotated examples

Instructions for adding a tutorial

[[Category: ]]


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 COLLADA 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. Mac OS X and most Linux distributions come with libxml already installed.

To validate the COLLADA document 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_1.xsd 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 outputs 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_1.xsd")) {
    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;
}