/** 
  * 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);
                    }
                }
            }
        }
    }
}
Example #3
0
 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;
     		}*/
 }
Example #4
0
/**
* 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";
}
Example #5
0
 /**
  * @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;
 }