Création
d'entreprise
Posez votre question Signaler

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

canarder 1001Messages postés 28 août 2008Date d'inscription 27 mai 2012Dernière intervention - Dernière réponse le 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.
Lire la suite 

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

17 réponses
Réponse
+0
moins plus
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 :
http://fr2.php.net/manual/fr/class.domxpath.php
http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

;)
Ajouter un commentaire
Réponse
+0
moins plus
ça m'aide pas beaucoup puisque je travaille en dom ..

UP !
Ajouter un commentaire
Réponse
+0
moins plus
UP c'est hyper urgent je devrais déjà avoir boucler ça ...
Ajouter un commentaire
Réponse
+0
moins plus
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 ;)
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
As-tu consulté la doc que je t'ai donnée (pour gérer le XPath avec DOM XML) ?
http://fr2.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

;)
Ajouter un commentaire
Réponse
+0
moins plus
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 ...
Ajouter un commentaire
Réponse
+0
moins plus
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 ;)
Ajouter un commentaire
Réponse
+0
moins plus
t'aurais pû demander sur la dev'list, on se serait fait un plaisir de te répondre ;)

- TheFireNight
canarder- 30 avril 2011 à 20:55
la dev'list ? en fait j'ai trouvé mieux je vais poster le code
Templier Nocturne- 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 :)
Templier Nocturne- 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 :)
Ajouter un commentaire
Réponse
+0
moins plus
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
Templier Nocturne- 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 :)
canarder- 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)
Templier Nocturne- 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 :)
Ajouter un commentaire
Réponse
-1
moins plus
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
Ajouter un commentaire
Ce document intitulé « [PHP] XML parser une balise hors d'une balise » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?