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 19/10/2007, 11h14   #1
Invité de passage
 
Inscription : octobre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 5
Points : 0
Points : 0
Par défaut [SimpleXML] utilisation de xpath

Bonjour,
Voici la structure du fichier xml que j'utilise :
Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<racine>
<element code='aa'>
<langue code_langue='aaa'>
<nom>
<forme attr='ltr'>
premiere forme
</forme>
<forme attr='ltr'>
deuxieme forme
</forme>
<forme attr='rtl'>
troisieme forme
</forme>
</nom>
</langue>
<langue code_langue='aab'>
<nom>
<forme attr='ltr'>
premiere forme
</forme>
<forme attr='rtl'>
deuxieme forme
</forme>
</nom>
</langue>
</element>
<element code='bb'>
...
</element>
</racine>

De ce fichier, j'extrais toutes les formes des éléments en fonction de la langue choisie grâce à xpath :

Code :
1
2
3
$xml = simplexml_load_file('element.xml');
$xpath='//element/langue[code_langue="aaa"]';
$element=$xml->xpath($xpath);
Ensuite avec une boucle je crée la liste déroulante suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
while (isset($element[$j])){
	$n=$j%2;		
	for ($k=0;$k<count($element[$j]->nom);$k++){
	$liste_option='';
		for ($l=0;$l<count($element[$j]->nom->forme);$l++){
		$liste_option.=$element[$j]->nom[$k]->forme[$l];
		if($l!=count($element[$j]->nom->forme)-1)$liste_option.=' / ';
                $liste_pays_meteo .="<option class='option$n'>" .$liste_option."</option>\n";
		}
	$j++;
	}
A ce point, j'aimerai pouvoir ajouter à la balise option :
<option class='option$n' value='attribut de l'élément parent'>

Et là je bloque. je ne vois pas comment extraire cet attribut.

Merci de votre attention.
merlin31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 13h16   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Tout d'abord sachez qu'il existe plus idiomatique comme méthode de parcours : l'itération foreach. Exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$xml = simplexml_load_file('element.xml');
$elements = $xml->xpath('//element/langue[@code_langue="aaa"]');
$j = 0;
foreach ($elements as $elt) {
    $n = $j % 2;		
    foreach ($elt->nom as $n) {
        $liste_option='';
        foreach ($n->forme as $f) {
            $liste_option .= (string) $f;
            /* ... */
            $liste_pays_meteo .= "<option class='option$n'>" . $liste_option . "</option>\n";
        }
    }
    $j++;
}
A priori il y a des erreurs dans votre code (incomplet) : des variables sont indéfinies ou mal utilisées ainsi que l'expression XPath (elle devrait être //element/langue[@code_langue="aaa"]).

Citation:
Envoyé par merlin31
A ce point, j'aimerai pouvoir ajouter à la balise option :
<option class='option$n' value='attribut de l'élément parent'>
Quel parent ? Par rapport à qui ? Les objets SimpleXMLElement ne vous permettent pas de remonter leur hiérarchie au contraire de l'extension DOM : le seul moyen est de posséder à un moment ou un autre une variable s'y référant (ce que vous permettent probablement vos diverses itérations).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 14h05   #3
Invité de passage
 
Inscription : octobre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 5
Points : 0
Points : 0
Par défaut petites précisions

J'ai toujours des soucis avec la boucle foreach .
Effectivement en recopiant le code j'avais oublié @code='aaa'.
L'attribut que j'essaie de récupérer, c'est l'attribut de la balise <element> qui est le premier ancêtre de <forme>.
Cet attribut n'est pas dans le tableau :
Code :
$elements = $xml->xpath('//element/langue[@code_langue="aaa"]');
Donc effectivement je n'ai pas de variable qui s'y réfère. Et c'est bien cela mon point de blocage je ne vois vraiment pas comment je peux la créer.
Je vais voir du côté de DOM
merlin31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 15h32   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Le plus simple serait sans doute de passer par une autre requête XPath. Je suppose que ceci revient à ce résultat :
Code :
1
2
3
4
5
6
$myelement = array_shift($xml->xpath('//element[langue[@code_langue="aaa"]]'));
if (!$myelement) {
    // ...
} else {
    echo $myelement['code'];
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h36.


 
 
 
 
Partenaires

Hébergement Web