/** * Pour tester la validité d'un document XML, on peut utiliser un analyseur syntaxique XML : http://fr3.php.net/manual/fr/book.xml.php * Voir en particulier l'exemple http://fr3.php.net/manual/fr/example.xml-structure.php * * Mais ceci ne permet pas de vérifier la conformité d'un XML avec une DTD. * DOMDocument le permet : http://fr2.php.net/manual/fr/domdocument.validate.php * Mais d'une part ça emmet des warnings et d'autre part ça ne retourne qu'un booléen sans détails sur les erreurs trouvées * * Pour y remédier on peut utiliser cette extention de classe "MyDOMDocument" : http://fr2.php.net/manual/fr/domdocument.validate.php#85792 * Mais attention : il faut lui fournir un objet DOMDocument et load ou loadXML provoquent des warnings préliminaires si le XML est mal formé. * * Ma solution est d'utiliser : * 1. dans un premier temps l'analyseur syntaxique XML xml_parse pour vérifier que le XML est bien formé * 2. dans un second temps l'extention de classe MyDOMDocument pour vérifier la conformité avec la DTD * * J'en ai fait la fonction ci-dessous "analyser_XML($fichier)". * La classe "MyDOMDocument" est dans autochargée (elle se trouve ici : _inc/class.domdocument.php). * * @param string $fichier_adresse * @return string 'ok' ou un message d'erreur */ private static function analyser_XML($fichier_adresse) { // Récupération du contenu du fichier $fichier_contenu = file_get_contents($fichier_adresse); $fichier_contenu = To::deleteBOM(To::utf8($fichier_contenu)); // Mettre en UTF-8 si besoin et retirer le BOM éventuel FileSystem::ecrire_fichier($fichier_adresse,$fichier_contenu); // Mettre à jour le fichier au cas où. // Analyse XML (s'arrête à la 1ère erreur trouvée) $xml_parser = xml_parser_create(); $valid_XML = xml_parse($xml_parser , $fichier_contenu , TRUE); if(!$valid_XML) { return sprintf("Erreur XML ligne %d (%s)" , xml_get_current_line_number($xml_parser) , xml_error_string(xml_get_error_code($xml_parser))); } xml_parser_free($xml_parser); // Analyse DTD (renvoie un tableau d'erreurs, affiche la dernière) $xml = new DOMDocument; $xml -> load($fichier_adresse); $xml = new MyDOMDocument($xml); $valid_DTD = $xml->validate(); if(!$valid_DTD) { return 'Erreur DTD : '.end($xml->errors); } // Tout est ok return 'ok'; }
public function __destruct() { $doc = $this->xml->asXML(); //print preg_replace("/></", ">\n<", $doc); //try //{ $dom = new \DOMDocument(); $dom->loadXML($doc, LIBXML_DTDLOAD | LIBXML_DTDATTR); $myDoc = new MyDOMDocument($dom); $isValid = $myDoc->validate(); /*if (!$isValid) { throw new \MyDomException($myDoc->errors); }*/ header('Content-type: text/xml; charset=utf-8'); echo preg_replace("/></", ">\n<", $doc); /*} catch(\MyException $e) { echo $e; }*/ }