[PHP] XML parser une balise hors d'une balise
Résolu
canarder
Messages postés
1714
Date d'inscription
Statut
Membre
Dernière intervention
-
Templier Nocturne Messages postés 7734 Date d'inscription Statut Membre Dernière intervention -
Templier Nocturne Messages postés 7734 Date d'inscription Statut Membre Dernière intervention -
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.
j'utilise PHP 5 avec dom xml.
merci pour votre aide.
<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:
- [PHP] XML parser une balise hors d'une balise
- Xml download - Télécharger - Édition & Programmation
- Apparaitre hors ligne instagram - Guide
- Gps hors ligne - Guide
- Fenêtre hors écran windows 11 - Guide
- Apparaitre hors ligne whatsapp - Guide
11 réponses
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 :
Celle-ci est sans doute un peu plus efficace car il n'y a pas de retour en arrière :
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
;)
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
;)
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 ;)
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 ;)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
il y a des choses avant, je peux pas te donner le lien du xml, c'est perso ...
mais un morceau :
Je ne comprend pas ce que tu propose, je travaille en DOM XML :
Sinon une erreur même si c'est hs, j'ai :
Parse error: syntax error, unexpected T_IF in **** on line 4
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.
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.
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 !
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
;)
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
;)
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 ...
ouai je vais apprendre, mais je fais pas beaucoup de javascript je comprenais pas trop le dom js ...
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 ;)
N'oublie pas le bouton résolu ;)
t'aurais pû demander sur la dev'list, on se serait fait un plaisir de te répondre ;)
- TheFireNight
- TheFireNight
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 :)
j'ai trouvé :
????? canarder ?????
Le Renard qui règne sur le WEB : Firefox
<?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
tien, moi je fais comme ça :
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 :)
$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 :)
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 :)
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 :)