IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[XML] Parser du XML plus facilement


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut [XML] Parser du XML plus facilement
    Bonjour, je me permet de créer un nouveau sujet afin de savoir s'il existe une solution plus simple (et moins "couteuse" qu'un foreach) pour récupérer une information d'un fichier XML.

    Pour la petite histoire, il y a une carte de France qui permet à l'utilisateur de sélectionner un département. Le numéro du département est transmis via l'url (liste.php?dep=XX). Je souhaite donc afficher le numéro (ça c'est bon, il est déjà dans l'url) et le nom du département qui correspond. Mon petit bout de code ci-dessous fonctionne pour récupérer le nom, mais je souhaiterais savoir s'il n'y a pas d'autres solutions plus simple et surtout, moins couteuse qu'un foreach (heureusement que je ne souhaite pas recenser toutes les villes, ça serait bien long de parcourir tout le fichier) ?

    Étant donné que chaque département à un attribut "num" unique, n'est-il pas possible de récupérer directement une information quelconque (que ça soit la valeur du noeud ou un attribut) lié à ce numéro, et ce, sans avoir à parcourir tout les autres départements ?


    Code qui me permet d'extraire le nom d'un département : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    		$dep_num = $_GET['dep']; // numéro du département transmis via l'URL (à partir de la carte)
     
     
    		// initialisation du XML
    		$dom = new DomDocument();
    		$dom->load('datas.xml');
     
     
    		$liste_dep = $dom->getElementsByTagName("dep");  // On liste tout les départements
    		foreach($liste_dep as $dep)
    		{
    			// On récupère le nom du département qui correspond au numéro
    			if ($dep->getAttribute("num") == $dep_num)
    			{
    				$dep_nom = utf8_decode($dep->nodeValue);  // Nom du département (valeur du noeud), avec décodage utf8 pour les accents
    				break; // inutile de continuer
    			}
    		}


    Code du fichier XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <departements>
    		<region name="Bretagne" enable="true" href="#" zoomable="true">
    			<dep num='29' href='liste.php?dep=29'>Finistère</dep>
    			<dep num='22' href='liste.php?dep=22'>Côtes-d'Armor</dep>
    			<dep num='56' href='liste.php?dep=56'>Morbihan</dep>
    			<dep num='35' href='liste.php?dep=35'>Ille-et-Vilaine</dep>
    		</region>
    </departements>


    2. Je souhaite ensuite faire évoluer mon fichier XML : est-il possible de rajouter un attribut "personnalisé" (comme nombre='XXX') et ensuite pouvoir récupérer la valleur "nombre" d'un département précis ?


    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Regardes peut-être du côté de DOMXPath.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    Merci du conseil, cette solution m'évite effectivement de parcourir tous les départements.

    Par contre, le query retourne un DOMNodelist, et il n'y a pourtant qu'un département (une ligne du XML) qui est retournée. Je n'arrive donc pas à faire un echo pour afficher directement la valeur du noeud.
    Je suis obligé de mettre un petit foreach (certes peu couteux étant donné qu'il n'y a qu'un département), mais n'est-il pas possible de faire autrement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	$dom = new DomDocument();
    	$dom->load('datas.xml');
     
    	$xpath = new domxpath($dom);
     
    	$dep_num = $_GET['dep'];
     
    	$liste = $xpath->query("//departements/region/dep[@num=$dep_num]");
     
    	foreach ($liste as $dep) {
    		echo utf8_decode($dep->nodeValue);
    	}

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    J'ai finalement trouvé la solution, grâce à item(0).
    Merci ABCIWEB pour m'avoir conseillé le XPath

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	$dep_num = $_GET['dep'];
     
    	$dom = new DomDocument();
    	$dom->load('datas.xml');
     
    	$xpath = new domxpath($dom);
     
    	$req = $xpath->query("//departements/region/dep[@num='$dep_num']");	
     
    	echo utf8_decode($req->item(0)->nodeValue);

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par gilloddon Voir le message
    J'ai finalement trouvé la solution, grâce à item(0).
    Merci ABCIWEB pour m'avoir conseillé le XPath
    Oui c'est puissant le xpath. Pour ceux que ça intéressent il y a une doc bien faite ici

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD14] XML + Plus bas niveau
    Par fhmayn dans le forum WinDev
    Réponses: 5
    Dernier message: 15/04/2010, 13h31
  2. XML plus rapide a parser selon sa structure?
    Par tamiii dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 26/09/2009, 07h31
  3. Réponses: 2
    Dernier message: 10/09/2009, 08h29
  4. Réponses: 29
    Dernier message: 13/06/2006, 16h48
  5. [C#][1.1]Parser XML plus proprement
    Par Laeticia dans le forum Windows Forms
    Réponses: 26
    Dernier message: 06/06/2006, 19h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo