5.11 Validating Against a Schema

Schemas are a way to define a specification for your XML documents. In PHP 4, there is no built-in way to validate an XML document against any type of schema. The PEAR XML_DTD package (available at http://pear.php.net/package/XML_DTD) provides a way to validate XML files against a Document Type Definition (DTD). However, because it uses SAX, it is not easy to combine DTD validation with DOM.

PHP 5 allows you to validate files against DTDs, XML Schema, and RelaxNG schema. The DOM extension supports all three types, while SimpleXML provides only an XML Schema validator.

5.11.1 PHP 5 and DOM

Validating any file using DOM is a similar process, regardless of the underlying schema format. To validate, call a validation method on a DOM object. It returns true if the file passes. If there's an error, it returns false and prints a message to the error log. There is no method for "capturing" the error message.

$file = 'address-book.xml';

$schema = 'address-book.xsd';

$ab = new DOMDocument

$ab->load($file);



if ($ab->schemaValidate($schema)) {

    print "$file is valid.\n";

} else {

    print "$file is invalid.\n";

}

If the schema is stored in a string, use DOMDocument::schemaValidateSource( ) instead of schemaValidate( ).

Table 5-4 lists all the validation methods.

Table 5-4. DOM schema validation methods

Method name

Schema type

Data location

schemaValidate

XML Schema

File

schemaValidateSource

XML Schema

String

relaxNGValidate

RelaxNG

File

relaxNGValidateSource

RelaxNG

String

validate

DTD

N/A


All of the validation methods behave in a similar manner, so you only need to switch the method name in the previous example to switch to a different validation scheme.

Both XML Schema and RelaxNG support validation against files and strings. You can validate a DOM object only against the DTD defined at the top of the XML document.