validate a xml file against a xsd using php validate a xml file against a xsd using php php php

validate a xml file against a xsd using php


This code does the business:

$xml= new DOMDocument();$xml->loadXML(<A string goes here containing the XML data>, LIBXML_NOBLANKS); // Or load if filename requiredif (!$xml->schemaValidate(<file name for the XSD file>)) // Or schemaValidateSource if string used.{   // You have an error in the XML file}

See the code in http://php.net/manual/en/domdocument.schemavalidate.php To retrieve the errors.

I.e.

justin at redwiredesign dot com 08-Nov-2006 03:32 post.


User contrib from http://php.net/manual/en/domdocument.schemavalidate.php

It works like a charm!

For more detailed feedback from DOMDocument::schemaValidate, disable libxml errors and fetch error information yourself. See http://php.net/manual/en/ref.libxml.php for more info.

example.xml

<?xml version="1.0"?><example>    <child_string>This is an example.</child_string>    <child_integer>Error condition.</child_integer></example>

example.xsd

<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"elementFormDefault="qualified">    <xs:element name="example">        <xs:complexType>            <xs:sequence>                <xs:element name="child_string" type="xs:string"/>                <xs:element name="child_integer" type="xs:integer"/>            </xs:sequence>        </xs:complexType>    </xs:element></xs:schema>

PHP

<?phpfunction libxml_display_error($error){    $return = "<br/>\n";    switch ($error->level) {        case LIBXML_ERR_WARNING:            $return .= "<b>Warning $error->code</b>: ";            break;        case LIBXML_ERR_ERROR:            $return .= "<b>Error $error->code</b>: ";            break;        case LIBXML_ERR_FATAL:            $return .= "<b>Fatal Error $error->code</b>: ";            break;    }    $return .= trim($error->message);    if ($error->file) {        $return .=    " in <b>$error->file</b>";    }    $return .= " on line <b>$error->line</b>\n";    return $return;}function libxml_display_errors() {    $errors = libxml_get_errors();    foreach ($errors as $error) {        print libxml_display_error($error);    }    libxml_clear_errors();}// Enable user error handlinglibxml_use_internal_errors(true);$xml = new DOMDocument();$xml->load('example.xml');if (!$xml->schemaValidate('example.xsd')) {    print '<b>DOMDocument::schemaValidate() Generated Errors!</b>';    libxml_display_errors();}?>


This is a complete code snippet for displaying xsd validation errors:

    $xml = '<test/>';    $xsd = '/path/to/xsd';    // needed for getting errors    libxml_use_internal_errors(true);    $domDocument= new DOMDocument();    $domDocument->loadXML($xml);     if (!$domDocument->schemaValidate($xsd)) {        $errors = libxml_get_errors();        foreach ($errors as $error) {            print_r($error);        }        libxml_clear_errors();    }