/** * 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'; }
function CheckLocation($url, &$locations) { $doc = new MyDOMDocument(); if ($doc) { $response = file_get_contents($url); if (strlen($response)) { $response = preg_replace('/[^(\\x20-\\x7F)]*/', '', $response); $doc->loadXML($response); $data = $doc->toArray(); $status = (int) $data['response']['statusCode']; if ($status == 200) { foreach ($locations as $location => &$testers) { foreach ($testers as $tester => &$cmd) { CheckTester($data, $location, $tester, $cmd); } } } } } }
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; }*/ }
/** * Go through and update the status of all of the tests * * @param mixed $results */ function UpdateResults(&$results, $testCount) { global $server; $count = 0; $changed = false; foreach ($results as &$result) { if (array_key_exists('id', $result) && strlen($result['id']) && (!array_key_exists('result', $result) || !strlen($result['result']))) { $count++; echo "\rUpdating the status of test {$count} of {$testCount}... "; $doc = new MyDOMDocument(); if ($doc) { $url = "{$server}xmlResult/{$result['id']}/"; $response = file_get_contents($url); if (strlen($response)) { $response = preg_replace('/[^(\\x20-\\x7F)]*/', '', $response); $doc->loadXML($response); $data = $doc->toArray(); $status = (int) $data['response']['statusCode']; if ($status == 200) { $changed = true; // test is complete, get the actual result GetTestResult($data['response']['data'], $result); } unset($doc); } } } } // clear the progress text echo "\r \r"; }
/** * @param array( "mime" <string>, "length" int, "content" string) * @return mixed string|array|boolean */ private function _convertToArray($response_array = array()) { if (!$response_array) { return array(); } else { if (strpos($response_array["mime"], 'xml')) { $output = new DOMDocument(); $output->loadXML($response_array["data"]); $out = new MyDOMDocument(); $output = $out->toArray($output); } elseif (strpos($response_array["mime"], 'json')) { if (!($output = json_decode($response_array["data"], true))) { $this->error = "Error: json parse error. "; return false; } } else { // if something else - return source $output = $response_array["data"]; } } return $output; }