An implementation of Relax NG schema validation written in Common Lisp, including support for compact syntax, DTD Compatibility, and the XSD type library.

cxml-rng was written by David Lichteblau and is designed as an add-on library for Closure XML. It is available under an X11-style license.

Please send bug reports to (list information).

Download and Installation

Download a cxml-rng tarball.

cxml-rng needs Closure XML, CL-PPCE, CL-Yacc, parse-number, and cl-base64. ASDF is used for compilation. Register the .asd file, e.g. by symlinking it, then compile cxml-rng using asdf:operate.

$ ln -sf `pwd`/cxml-rng.asd /path/to/your/registry/
* (asdf:operate 'asdf:load-op :cxml-rng)

Implementation-specific notes

At this point, cxml-rng is written to work with Lisp strings (as opposed to runes and rods), and is meant to be used on Lisp implementations with Unicode support.


API documentation is available.


Use cxml-rng:parse-schema to parse a Relax NG schema file. The resulting schema object is a representation of a simplified schema using Lisp objects, which has gone through simplification as described the Relax NG specification. cxml-rng:serialize-schema can be used to write a Relax NG file in XML syntax for this grammar.

In order to validate XML against a schema, create a validation handler for the grammar using cxml-rng:make-validator. The validation handler processes SAX events and can be used with any function generating such events, in particular with cxml:parse-file.

(cxml:parse-file "example.xml"
                  (cxml-rng:parse-schema #p"example.rng")))

The validator accepts another SAX handler as an optional second argument. For example, to parse XML into DOM while also validating it, use the validator like this:

(cxml:parse-file "example.xml"
                  (cxml-rng:parse-schema #p"example.rng")

When using the klacks parser, create a validating source.

    (s (cxml-rng:make-validating-source
        (cxml-rng:parse-schema #p"example.rng")))
  (loop for key = (klacks:peek-next s) while key do (print key)))

DTD Compatibility processing (basically, checking of IDs and addition of default values) is done using a DTD Compatibility handler. You can use this handler together with a validator or by its own.

(cxml:parse-file "example.xml"
                  (cxml-rng:parse-schema #p"example.rng")

Recent changes