[PHP] XML parser une balise hors d'une balise

Résolu/Fermé
canarder Messages postés 1714 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 - 9 oct. 2010 à 12:56
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 - 14 mai 2011 à 20:18
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.


A voir également:

11 réponses

Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
9 oct. 2010 à 14:04
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

;)
0
canarder Messages postés 1714 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
11 oct. 2010 à 21:54
ça m'aide pas beaucoup puisque je travaille en dom ..

UP !
0
canarder Messages postés 1714 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
12 oct. 2010 à 18:41
UP c'est hyper urgent je devrais déjà avoir boucler ça ...
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
13 oct. 2010 à 19:33
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 ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
canarder Messages postés 1714 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
Modifié par canarder le 13/10/2010 à 22:10
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.
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
14 oct. 2010 à 11:30
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

;)
0
canarder Messages postés 1714 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
15 oct. 2010 à 08:50
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 ...
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
15 oct. 2010 à 13:23
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 ;)
0
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 102
1 avril 2011 à 14:05
t'aurais pû demander sur la dev'list, on se serait fait un plaisir de te répondre ;)

- TheFireNight
0
canarder Messages postés 1714 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
30 avril 2011 à 20:55
la dev'list ? en fait j'ai trouvé mieux je vais poster le code
0
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 102
2 mai 2011 à 15:30
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 :)
0
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 102
2 mai 2011 à 15:34
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 :)
0
canarder Messages postés 1714 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
Modifié par canarder le 30/04/2011 à 21:06
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
0
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 102
2 mai 2011 à 15:47
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 :)
0
canarder Messages postés 1714 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
14 mai 2011 à 19:38
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)
0
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 102
14 mai 2011 à 20:18
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 :)
0
canarder Messages postés 1714 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
16 oct. 2010 à 14:03
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
-1