Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

validate a xml file against a xsd using php

Tags:

how to validate a xml file against a xsd? there is domdocument::schemaValidate() but It does not tell where are the errors. is there any class for that? does it have any worth making that parser from scratch? or is it just reinventing he wheel,

like image 971
varuog Avatar asked Jul 25 '12 13:07

varuog


People also ask

Can we validate XML documents against a schema?

You can validate your XML documents against XML schemas only; validation against DTDs is not supported. However, although you cannot validate against DTDs, you can insert documents that contain a DOCTYPE or that refer to DTDs.

How do I reference XML in XSD?

Reference the XSD schema in the XML document using XML schema instance attributes such as either xsi:schemaLocation or xsi:noNamespaceSchemaLocation. Add the XSD schema file to a schema cache and then connect that cache to the DOM document or SAX reader, prior to loading or parsing the XML document.


2 Answers

This code does the business:

$xml= new DOMDocument(); $xml->loadXML(<A string goes here containing the XML data>, LIBXML_NOBLANKS); // Or load if filename required if (!$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.

like image 125
Ed Heal Avatar answered Oct 24 '22 11:10

Ed Heal


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

<?php  function 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 handling libxml_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(); }  ?> 
like image 25
Maciej Niemir Avatar answered Oct 24 '22 13:10

Maciej Niemir