Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/08/2006, 13h20   #1
Invité de passage
 
Développeur informatique
Inscription : août 2006
Messages : 27
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2006
Messages : 27
Points : 4
Points : 4
Par défaut [SimpleXML] Filtrer des balises grâce à leurs attributs

Bonjour,

J'utilise php et simplexml.

Je rencontre actuellement le problème suivant :

J'ai ce fichier xml

Code XML :
1
2
3
4
5
6
7
8
9
<racine>
<identifiant>toto</identifiant>
<information1 type="a">blabla</information1>
<information1 type="b">blibli</information1>
<information2>bleble</information>
<information3 type="a">bloblo</information1>
<information3 type="b">blublu</information1>
...
</racine>

que j'ouvre ainsi $xml= simplexml_load_file('monFichier.xml');

et j'aimerai filtrer les informations pour ne retenir que celles qui n'ont pas d'attribut et celles qui ont l'attribut type="a".

Est-il possible de faire cela avec un xpath ?

Encore mieux, est-il possible de faire cela sans passer par un xpath, en complétant cet appel $xml->information1 avec l'information type="a", directement sans passer par une condition if ?


Merci de votre aide
tatayecorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 13h41   #2
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
je pense que quelquechose de ce style te conviendra : ( http://fr2.php.net/manual/fr/functio...ment-xpath.php )

Code :
1
2
$xml= simplexml_load_file('monFichier.xml');
$balises_avec_att_a_eq_1 = $xml->xpath('/racine/*[starts-with(name(), "information")][not(@type) or @type = "a"]');
Que fait le XPath ? :

Récupération des noeuds (~~balises) fils de <racine> dont le nom commence par "information" et qui n'ont pas d'attribut "type" ou dont l'attribut "type" vaut "a"
__________________
Rédacteur "éclectique" (XML, IRC, Web...)
Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
pensez à la balise [code] (bouton #) et au tag (en bas)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 14h09   #3
Invité de passage
 
Développeur informatique
Inscription : août 2006
Messages : 27
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2006
Messages : 27
Points : 4
Points : 4
Bonjour et merci pour cette réponse.

Je me suis mal exprimé lorsque j'ai dit "j'aimerai filtrer les informations",

en fait pour le xml cité en exemple j'aimerai récupérer les infos

Code :
1
2
3
4
$xml->identifiant (toto)
$xml->information1 (blabla)
$xml->information2 (bleble)
$xml->information3 (bloblo)
Lorsque j'utilise ta requête dans le xpath (que ce soit avec en condition type="a" ou type="b") et que je fais un
Code :
echo $xml->information1
je récupère systématiquement blabla ...
tatayecorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 14h11   #4
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
C'est parce qu'il te faut ensuite parcourir le résultat du XPath...

et pas ton document XML (sinon effectivement ça sert à rien)
__________________
Rédacteur "éclectique" (XML, IRC, Web...)
Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
pensez à la balise [code] (bouton #) et au tag (en bas)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 14h26   #5
Invité de passage
 
Développeur informatique
Inscription : août 2006
Messages : 27
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2006
Messages : 27
Points : 4
Points : 4
Citation:
Envoyé par Swoög
C'est parce qu'il te faut ensuite parcourir le résultat du XPath...

et pas ton document XML (sinon effectivement ça sert à rien)

Mais dans ce cas là si je fais un
Code :
$test=$xml->xpath('/racine/*[not(@type) or @type= "a"]');
je suis obligé de récupérer les informations par un index, genre on ne peut pas parcourir par rapport au nom de la balise ?
tatayecorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 14h40   #6
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
si tu veux avoir un nom de balise spécifique, il te faut alors modifier le XPath en conséquence...

celui que je t'ai donné récupèrera toutes les balises dont le nom commence par "information" ensuite, si tu ne veux que les balises "information1" :
Code :
/racine/information1[not(@type) or @type = "a"]
__________________
Rédacteur "éclectique" (XML, IRC, Web...)
Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
pensez à la balise [code] (bouton #) et au tag (en bas)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 14h49   #7
Invité de passage
 
Développeur informatique
Inscription : août 2006
Messages : 27
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2006
Messages : 27
Points : 4
Points : 4
Merci pour les réponses.

C'est dommage, ça rend les manipulations un peu lourdingue...

J'aurais aimé une solution qui me permette de n'utiliser qu'un seul fichier xml tout en faisant l'impasse à un xml qui contient des informations redondantes de type

Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
<racine>
<bloc type="a">
<identifiant>toto</identifiant>
<information1>blabla</information1>
<information2>bleble</information>
<information3>bloblo</information1>
</bloc>
<bloc type="b">
<identifiant>toto</identifiant>
<information1>blibli</information1>
<information2>bleble</information>
<information3>blublu</information1>
</bloc>

Le tout en évitant de faire trop d'appels via xpath.
tatayecorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 14h53   #8
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
dans ce cas, il te suffit de récupérer bloc avec un XPath...

après tu as l'élément bloc, tu peux faire toutes tes manips, exemple :
Code :
1
2
3
4
$xml = simple_xml_load(...);
$bloc = $xml->xpath('/racine/bloc[@type="a"]');
$bloc = $bloc[1];
echo $bloc->information1;
__________________
Rédacteur "éclectique" (XML, IRC, Web...)
Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
pensez à la balise [code] (bouton #) et au tag (en bas)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 14h59   #9
Invité de passage
 
Développeur informatique
Inscription : août 2006
Messages : 27
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2006
Messages : 27
Points : 4
Points : 4
Citation:
Envoyé par Swoög
dans ce cas, il te suffit de récupérer bloc avec un XPath...

après tu as l'élément bloc, tu peux faire toutes tes manips, exemple :
Code :
1
2
3
4
$xml = simple_xml_load(...);
$bloc = $xml->xpath('/racine/bloc[@type="a"]');
$bloc = $bloc[1];
echo $bloc->information1;
C'est sûr, mais le but de la manoeuvre était justement d'éviter d'avoir en double des informations comme la balise identifiant ayant la même valeur dans le bloc type="a" et dans le bloc type="b".

Pas chiant le gars...
tatayecorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 16h32   #10
Rédacteur
 
Avatar de Swoög
 
Inscription : janvier 2003
Messages : 6 053
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : janvier 2003
Messages : 6 053
Points : 7 144
Points : 7 144
Envoyer un message via MSN à Swoög Envoyer un message via Skype™ à Swoög
Dans ce cas, il va te falloir modifier le tout... éventuellement, tu peux faire une petite fonction qui te retrie le tableau, mais le plus simple à l'air d'être de toutes façon l'utilisation "massive" d'XPath, ou alors il te faudra peut-être te tourner vers une autre lib XML (comme DOM)...
__________________
Rédacteur "éclectique" (XML, IRC, Web...)
Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
pensez à la balise [code] (bouton #) et au tag (en bas)
Swoög est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 20h06   #11
Invité de passage
 
Développeur informatique
Inscription : août 2006
Messages : 27
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2006
Messages : 27
Points : 4
Points : 4
Bah, je vais séparer les infos en deux blocs distincts, et utiliser une fois le xpath, c'est encore la meilleure solution.

C'est dommage qu'il n'y ait pas de variante à $xml->information1 avec la possibilité d'avoir un attribut en paramètre.

En tout cas merci pour les suggestions !
tatayecorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h21.


 
 
 
 
Partenaires

Hébergement Web