Alors mon but étant de me faciliter la récupération des données XML distantes j'ai élaborée cette petite classe qui permet de récupérer le flux XML sous forme d'objet SimpleXMLElement.
Et ensuite de récupérer les données voulu dans cet objet.
class XMLCollector { /*Classe XMLCollector, Par Tirias*/ #Objet SimpleXMLElement private $simpleXML; /*Return void*/ /*Crée l'objet simpleXMLElement **avec le flux xml spécifié par l'url*/ public function __construct($url) { if(is_string($url)) { if(!preg_match('#^http://.+#isU', $url)) { throw new Exception('L\'URL proposée n\'est pas valide'); } else { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); if($contenu = curl_exec($curl)) { $this->simpleXML = new simpleXMLElement($contenu); } else { throw new Exception('La connexion au serveur distant n\'a pas put être effectuée. Vérifiez votre URL'); } } } else { throw new Exception('Vous devez fournier l\'URL sous forme d\'une chaine de caractère'); } } /*Return array*/ /*Effectue un array_merge plus profond **dans un array multidimensionel*/ public function replaceArray($arr) { $arr = (array)$arr; $argc = func_num_args(); if($argc != 1) { $argv = func_get_args(); for ($i = 1; $i < $argc; $i++) $arr = array_merge($arr, (array)$argv[$i]); } $temparr = array(); foreach($arr as $key => $value) { if(is_array($value)) $temparr = array_merge($temparr, $this->replaceArray($value)); else $temparr = array_merge($temparr, array($key => $value)); } return $temparr; } /*Return array*/ /*Retourne les données de l'objet SimpleXMLElement **spécifiées dans l'argument data*/ public function seekDatas($data, $arr = null) { $return = array(); if(is_string($data)) { foreach($arr as $key => $value) { if(is_object($value)) { $return[] = $this->seekDatas($data, $value); if($key == $data) { $return[] = $value; } } if(!is_object($value)) { if($key == $data) { $return[] = $value; } } } foreach($return as $key => $value) { if(empty($value)) { unset($return[$key]); } } $return = $this->replaceArray($return); return $return; } else { throw new Exception('La donnée recherchée doit être transmise sous forme de chaine de caractère'); } } /*Return mixed*/ /*Methode magique __get qui permet **d'accèder à un attribut privée de AddOns*/ public function __get($var) { if(property_exists('XMLCollector', $var)) { return $this->$var; } else { throw new Exception('Vous tentez d\'accèder à un attribut de la classe XMLCollector inexistant'); } } }
Voila comment le faire fonctionner :
<?php try { $adds = new XMLCollector('L\'URL distante'); $arr = $adds->seekDatas('technologie', $adds->simpleXML); } catch(Exception $e) { echo '<p>Erreur : '.$e->getMessage().'</p>'; }
Rendu : avec une recherche pour technologie :
Array ( [0] => SimpleXMLElement Object ( [nom] => Alliage [niveau] => 4 ) [1] => SimpleXMLElement Object ( [nom] => Balistique [niveau] => 5 ) [2] => SimpleXMLElement Object ( [nom] => Explosif [niveau] => 3 ) [3] => SimpleXMLElement Object ( [nom] => Energie [niveau] => 5 ) [4] => SimpleXMLElement Object ( [nom] => Télécommunication [niveau] => 3 ) [5] => SimpleXMLElement Object ( [nom] => Espionnage [niveau] => 2 ) [6] => SimpleXMLElement Object ( [nom] => Aéronautique [niveau] => 3 ) [7] => SimpleXMLElement Object ( [nom] => Equipement [niveau] => 3 ) [8] => SimpleXMLElement Object ( [nom] => Système Défensif [niveau] => 4 ) [9] => SimpleXMLElement Object ( [nom] => Moteur à Explosion [niveau] => 6 ) [10] => SimpleXMLElement Object ( [nom] => Optique [niveau] => 4 ) [11] => SimpleXMLElement Object ( [nom] => Météorologie [niveau] => 2 ) [12] => SimpleXMLElement Object ( [nom] => Sciences Physiques & Mathématiques [niveau] => 5 ) )
Par exemple
Je compte continuer à l'améliorer si j'ai du temps N'hésitez pas à commenter