L'extension DOM met à disposition plusieurs moyens de validation d'un document XML. Contrairement à ces prédécesseurs, PHP 5 introduit la validation par des schémas W3C ou Relax NG en plus de la validation traditionnelle par la définition de type du document (DTD).
//Inidique si le document doit être (true) //ou ne pas être (false) validé par sa DTD $doc_xml->validateOnParse = true; //Validation d'un document XML en fonction de sa DTD $booleen = $doc_xml->validate(); //Valide un document XML en fonction //du fichier contenant le schéma XSD $booleen = $doc_xml->schemaValidate('schema.xsd'); //Valide un document XML en fonction de //la chaîne de caractères contenant le schéma XSD $booleen = $doc_xml->schemaValidateSource($sourceXSD); //Valide un document XML en fonction //du fichier contenant le schéma Relax NG $booleen = $doc_xml->relaxNGValidate('schema.rng'); //Valide un document XML en fonction de //la chaîne de caractères contenant le schéma XSD $booleen = $doc_xml->relaxNGValidateSource($sourceRNG);
La validation par DTD nécessite que le document XML contienne au moins la déclaration DOCTYPE afin que ce document puisse être validé par la méthode validate() ou directement au chargement à l'aide de l'attribut validateOnParse.
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- Fichier : employes.xml --> <!DOCTYPE employes SYSTEM "definition.dtd"> <employes> <!-- ... --> </employes> <?php $doc_xml = new DOMDocument(); $doc_xml->validateOnParse = true; $doc_xml->load('employes.xml'); if($doc_xml->validate();) echo 'Le document XML est valide'; ?>
La méthode validate() permet de revalider le document XML suite à une modification de son arborescence.
La validation par des schémas W3C et Relax NG demande simplement de fournir :
<?php $doc_xml = new DOMDocument(); $doc_xml->load('source.xml'); if($doc_xml->validateSchema('schema.xsd');) echo 'Le document XML est valide par rapport au schéma W3C'; if($doc_xml->relaxNGValidate('schema.rng');) echo 'Le document XML est valide par rapport au schéma Relax NG'; ?>
Si le document XML comporte déjà une déclaration de type de document, cela ne pose aucun problème pour tenter des validations avec d'autres schémas.
<php $fichier = 'employes'; $doc_xml = new DOMDocument(); $doc_xml->validateOnParse = true; if($doc_xml->load($fichier . '.xml')){ echo '<h3>Le document XML ' . $employe . 'n\'a été chargé !</h3>'; if($doc_xml->validate()) echo '<p>Le document XML est valide ' . 'par rapport à la DTD</p>'; if($doc_xml->schemaValidate($fichier . '.xsd')) echo '<p>Le document XML est valide ' . 'par rapport au schéma W3C</p>'; if($doc_xml->relaxNGValidate($fichier . '.rng')) echo '<p>Le document XML est valide ' . 'par rapport au schéma Relax NG</p>'; } else echo '<p style="color:red">Le document XML ' . $employe . 'n\'a pu être chargé !</p>'; ?> <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Fichier : employes.xml --> <employes> <employe id="RJ1002" service="DG001"> <nom>Robierre</nom> <prenom>Jean</prenom> </employe> <employe id="LA1012" service="DG001"> <nom>Lardut</nom> <prenom>Anne</prenom> </employe> <employe id="GA1013" service="ST001"> <nom>Guilde</nom> <prenom>Angélique</prenom> </employe> <employe id="HP1022" service="SC001"> <nom>Henry</nom> <prenom>Paul</prenom> </employe> <employe id="MM1045" service="RH001"> <nom>Mortier</nom> <prenom>Marc</prenom> </employe> <employe id="LS1102" service="SQ001"> <nom>Lebreton</nom> <prenom>Sophie</prenom> </employe> <employe id="JM1095" service="RD001"> <nom>Jolie</nom> <prenom>Martine</prenom> </employe> <employe id="MT1036" service="SC101"> <nom>Marcelin</nom> <prenom>Tania</prenom> </employe> <employe id="LL1029" service="SC101"> <nom>Léger</nom> <prenom>Laurence</prenom> </employe> <employe id="DM1052" service="SC001"> <nom>Duroi</nom> <prenom>Maxime</prenom> </employe> </employes> <?xml version="1.0" encoding="UTF-8"?> <!-- Fichier : definition.dtd --> <!ELEMENT employe (nom, prenom)> <!ATTLIST employe id ID #REQUIRED service NMTOKEN #REQUIRED > <!ELEMENT employes (employe+)> <!ELEMENT nom (#PCDATA)> <!ELEMENT prenom (#PCDATA)> <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Fichier : schema.xsd --> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:element name="employe"> <xsd:complexType> <xsd:sequence> <xsd:element ref="nom"/> <xsd:element ref="prenom"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:ID" use="required"/> <xsd:attribute name="service" type="xsd:NMTOKEN" use="required"/> </xsd:complexType> </xsd:element> <xsd:element name="employes"> <xsd:complexType> <xsd:sequence> <xsd:element ref="employe" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="nom" type="xsd:string"/> <xsd:element name="prenom" type="xsd:string"/> </xsd:schema> <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Fichier : schema.rng --> <element name="employes" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> <oneOrMore> <element name="employe"> <attribute name="id"> <data type="ID"/> </attribute> <attribute name="service"> <data type="NMTOKEN"/> </attribute> <element name="nom"> <text/> </element> <element name="prenom"> <text/> </element> </element> </oneOrMore> </element> |