World of Avalloc - Forum: Récupération des données XML - World of Avalloc - Forum

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Récupération des données XML

#1 L'utilisateur est hors-ligne   Tirias Icône

  • Membre
  • PipPip
  • Groupe : Membres
  • Messages : 21
  • Inscrit(e) : 18-février 10

Posté 04 mars 2010 - 23:10

Bonsoir,
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

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)