[PHP] XML parser une balise hors d'une balise [Résolu/Fermé]

Signaler
Messages postés
1706
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 mai 2018
-
Messages postés
7716
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
21 mai 2016
-
Bonjour, je sais comment prendre la première ou la deuxième, etc ... balise présente dans un xml, mais je veux la deuxième et toutes les suivantes, soit toutes celles hors d'une certaine balise.

<owner>
<citizen> // je ne la veux pas
</owner>
<citizen /> // je la veux
<citizen /> // je la veux
<citizen /> // je la veux


j'utilise PHP 5 avec dom xml.

merci pour votre aide.


11 réponses

Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
184
Salut,
je connais pas DOM XML pour PHP mais je peux te donner des formules XPath qui font ce que tu cherches.

Celle-ci recherche tous les noeuds <citizen> puis enlève ceux qui ont <owner> dans leurs parents :
//citizen[not(parent::owner)]

Celle-ci est sans doute un peu plus efficace car il n'y a pas de retour en arrière :
/citizen

mais elle ne marche que si les <citizen> sont à la racine du document.

Ces liens pourront te servir :
https://www.php.net/manual/fr/class.domxpath.php
http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

;)
Messages postés
1706
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 mai 2018
345
ça m'aide pas beaucoup puisque je travaille en dom ..

UP !
Messages postés
1706
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 mai 2018
345
UP c'est hyper urgent je devrais déjà avoir boucler ça ...
Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
184
C'est tout ce que t'as dans ton XML ou tu as d'autres choses au niveau supérieur ?
Sinon tu peux partir de la racine (documentRoot) et accéder tout de suite à citizen, comme ça tu n'auras que ceux du premier niveau...

Sinon tu récupères tous les citizen puis tu testes ceux qui ont owner pour parent, et tu vires ceux-là.

Bon courage ;)
Messages postés
1706
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 mai 2018
345
il y a des choses avant, je peux pas te donner le lien du xml, c'est perso ...
mais un morceau :
<hordes>  
<headers>  
<owner>  
<citizen></citizen> // je ne veux pas  
<myZone/>  
</owner>  
<game/>  
</headers>  
...  
<citizen></citizen> (il y en a de 1 à 40 ici)  
<citizen></citizen>  
<citizen></citizen>  
...  
</hordes>  


Je ne comprend pas ce que tu propose, je travaille en DOM XML :
$xml = "fichier.xml"; 
$dom = new DOMDocument(); 
if (!$dom->load($xml)) { 
// ici on est pas connecté 
echo "erreur ..."; 
exit; 
} 
else 
{ 
// ici pas d'erreur 
echo "pas erreur"; 
... 
} 


Sinon une erreur même si c'est hs, j'ai :
Parse error: syntax error, unexpected T_IF in **** on line 4

<?php 
session_start() 

if(!isset($_POST['key'])) { // <- ici l'erreur mais je vois pas ... 
 session_destroy(); 
 header("Location: /"); // key non envoyé, on envoit à l'accueil 
 exit; 
} 
... 
?> 

et j'ai oublié aucun point virgule ni aucune parenthèse ou autre, j'ai rien avant ce code, ça marchait avec un autre fichier mais un truc manquait je l'ai refais.
Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
184
As-tu consulté la doc que je t'ai donnée (pour gérer le XPath avec DOM XML) ?
https://www.php.net/manual/fr/class.domxpath.php

Pour ton erreur, il manque un point-virgule après session_start() .

Sinon en fait, l'extension est mappée comme en JavaScript (heureusement), ce qui fait que j'ai pu m'en sortir sans connaître. J'ai pris la peine de faire des tests sur mon propre serveur, tu as de la chance !

$hordesChildren = $dom->documentElement->childNodes;

$citizens = array();
for ($i = 0; $child = $hordesChildren->item($i); $i++) {
  if ($child->nodeType == XML_ELEMENT_NODE && $child->tagName == 'citizen') {
    $citizens[] = $child;
  };
};

// $citizens est un array contenant seulement les <citizen> directement enfants de <hordes>


Et un conseil : apprends à lire la doc du DOM officiel, c'est super utile.
http://www.w3.org/TR/DOM-Level-2-Core/core.html

;)
Messages postés
1706
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 mai 2018
345
merde j'ai pas vu pour le point-virgule -_-'

ouai je vais apprendre, mais je fais pas beaucoup de javascript je comprenais pas trop le dom js ...
Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
184
En fait c'est ça qui est magique avec le DOM : ça ne dépend pas du langage !

N'oublie pas le bouton résolu ;)
Messages postés
7716
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
21 mai 2016
1 066
t'aurais pû demander sur la dev'list, on se serait fait un plaisir de te répondre ;)

- TheFireNight
Messages postés
1706
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 mai 2018
345
la dev'list ? en fait j'ai trouvé mieux je vais poster le code
Messages postés
7716
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
21 mai 2016
1 066
cette personne (sans vous raconter sa vie, elle risquerait de m'en vouloir), développe un site communautaire et d'autres personnes (dont moi) développent aussi ce genre de sites, réunis autour d'une mailing list qu'on appelle la dev'list. cette liste est plutot la pour s'organiser, mais je pense que pour demander un coup de main, on peut y faire un tour, on est sûr d'avoir une réponse dans l'heure pour ce genre de problèmes :)
Messages postés
7716
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
21 mai 2016
1 066
ha ben cette personne, il s'avère que c'est toi :/

si tu as le node owner, c'est que tu as l'accès sécurisé, donc je n'ai pas besoin de t'indiquer le lien pour la dev'list je pense. au besoin, MP moi sur CCM pour que je te le redonne :)
Messages postés
1706
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 mai 2018
345
j'ai trouvé :

<?php 
$xml = "http://site.com/xml"; 
$dom = new DOMDocument(); 
$dom->load($xml); 
$nodeName = "node"; // nom de la node (ici pour <node>)
$nmbr = 0; // numéro de la node, la première étant 0 et la deuxième 1 (etc ...) 
$attr = $dom->getElementsByTagName($nodeName)->item($nmbr)->getAttribute("attr"); 
$val = $dom->getElementsByTagName($nodeName)->item($nmbr)->nodeValue; 
?>

????? canarder ?????
Le Renard qui règne sur le WEB : Firefox
Messages postés
7716
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
21 mai 2016
1 066
tien, moi je fais comme ça :

$url = ('http://www.********.fr/xml/?k='.$API.';sk=****************');
// Ouverture du flux
$xml = @simplexml_load_file($url);
$pseudo = $xml->headers[0]->owner[0]->citizen[0]['name'];
// exemple avec xpath
$citizens = $xml->xpath('//citizens/citizen'); // récupere un tableau avec les citoyens

$nb = 0;
// parcours du tableau et affichage de tous les noms
foreach($citizens as $citizen)
{
$nb ++;
$citoyen[$nb] = .$citizen['name'];
}


là, ça te créé un tableau avec l'ensemble des pseudos des citoyens

c'est pas du DOM (parce que je ne sais pas l'utiliser) mais ça marche :)
Messages postés
1706
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 mai 2018
345
c'est vrai ça à l'air un peu plus simple, y a-t-il des problèmes si la balise n'existe pas ? (= api non valide ou mort non validée)
Messages postés
7716
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
21 mai 2016
1 066
le traditionnel Not_In_Game ou invalid_keys :)


si tu tente de parser tout de même, il ne se passe juste rien :

il va chercher dans le XML
il va trouver du vide
il va stoker ce vide dans une variable
et tant qu'il y aura des valeurs à récupérer dans cette variable, elle seront récupérés dans des variables distinctes; pas de contenu, pas de nouvelles variables :)
Messages postés
1706
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 mai 2018
345
c'est pas ta réponse qui m'a fait résoudre le problème (et je suis assez ancien pour connaître le bouton résolu)

en fait, si la valeur d'un attribut était égale à celui dans owner, j'affichais rien