Arcy Posté(e) le 28 juin 2015 Partager Posté(e) le 28 juin 2015 Bonjour, Je travaille actuellement sur un projet où je dois lire un fichier XML (pas de JSON, j'ai besoin des attributs) et mettre ces infos dans un tableau. <?xml version="1.0" encoding="UTF-8"?><?DOCTYPE test SYSTEM "./test.dtd"?><test> <a1> <b> <date> 14 juillet </date> <intitule> Fête nationale ! </intitule> </b> <b> <date> 24 décembre </date> <intitule> Noël \o/ </intitule> </b> </a1> <a2> </a2></test> <?xml version="1.0" encoding="UTF-8"?><!ELEMENT test(a1, a2)><!ELEMENT a1(b*)><!ELEMENT b(date, intitule)><!ELEMENT date(#PCDATA)><!ELEMENT intitule(#PCDATA)><!ELEMENT a2(#PCDATA)> Mon objectif est de récupérer le premier élément (<a1> et de lire le contenu de <a2> dans une boucle) J'ai donc : $dom = new DOMDocument();$dom->load("./inc/test.xml");$elementA1 = $dom->getElementsByTagName("a1");$listeElementsB = $elementA1->getElementsByTagName("b");foreach ($listeElementsB as $B) { echo $B->firstChild->nodeValue;} (Je me base sur http://eusebius.developpez.com/php5dom/) Mais rien ne s'affiche :( Et vous connaissez un équivalent de var_dump() pour les données XML ? Chez moi, ça se contente de dire (par exemple) object(DOMNodeList)[2]. C'est pas très parlant ... Merci ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cara62 Posté(e) le 29 juin 2015 Partager Posté(e) le 29 juin 2015 <?php$dom = new DOMDocument();$dom->load('testxml.xml');$listeA1 = $dom->getElementsByTagName('a1'); foreach($listeA1 as $a1) { $listeB = $a1->getElementsByTagName('b'); foreach($listeB as $B) { $listeElementsDate = $B->getElementsByTagName('date'); $listeElementsInt = $B->getElementsByTagName('intitule'); foreach($listeElementsDate as $elemDate) { echo $elemDate->firstChild->nodeValue."<br>"; } foreach($listeElementsInt as $elemInt) { echo $elemInt->firstChild->nodeValue."<br>"; } } } Voilà, c'est pas opti, mais j'affiche bien le contenu de date et intitule. J'ai pas regardé, mais si il y a une méthode pour accéder directement à date et intitule ça sera plus simple je pense. Tu trouveras peut être ton bonheur ici Après je sais pas si j'ai bien répondu à ta question, j'ai pas trop compris pour a2. Edit : je pense que le premier foreach est de trop. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 29 juin 2015 Auteur Partager Posté(e) le 29 juin 2015 J'ai essayé sans le premier foreach() mais j'ai une erreur. $listeA1 = $dom->getElementsByTagName('a1');$listeB = $listeA1->getElementsByTagName('b'); Merci pour ton aide, je laisse quand même ouvert pour ceux qui veulent optimiser le code ;-) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cara62 Posté(e) le 29 juin 2015 Partager Posté(e) le 29 juin 2015 Ouep j'ai testé aussi et ça me fait une erreur. :) Faudrait sûrement éviter que Listea1 soit un tableau pour enlever le foreach Lien vers le commentaire Partager sur d’autres sites More sharing options...
maximeK Posté(e) le 30 juin 2015 Partager Posté(e) le 30 juin 2015 Salut je te conseil SimpleXMLElement tout se que tu as besoin est ici : https://secure.php.net/manual/fr/simplexml.examples-basic.php sinon le xml2array c'est 3 lignes : $xml = simplexml_load_string($xmlstring);$json = json_encode($xml);$array = json_decode($json,TRUE); Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 30 juin 2015 Auteur Partager Posté(e) le 30 juin 2015 Ah cool, je vais regarder du coté de SimpleXML. Sinon je pensais aussi prendre le JSON à la base mais impossible, j'ai besoin des attributs. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 30 juin 2015 Partager Posté(e) le 30 juin 2015 En fait ton A1 est unique c'est ça? (vu que tu veux pas que ce soit un tableau). Si oui, en C# j'aurais fait un first() sur mon élément tableau (je sais plus si ça existe en PHP ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 30 juin 2015 Auteur Partager Posté(e) le 30 juin 2015 A1 est unique mais il peut contenir plusieurs éléments, effectivement. J'ai vu que des méthodes existaient pour le XML, je les ais pas testés. Je verrais ça aussi. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 30 juin 2015 Partager Posté(e) le 30 juin 2015 J'ai un peu chercher, en gros j'ai l'impression que tu peux faire un truc du genre $listeB = $listeA1->item(0)->getElementsByTagName('b'); Essaie ça! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 9 juillet 2015 Auteur Partager Posté(e) le 9 juillet 2015 Désolé pour le retard, difficile de bosser avec la canicule ... SimpleXML semble correspondre à mon besoin. Je termine mon projet et si ça fonctionne bien, je met en résolu :-) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 12 juillet 2015 Auteur Partager Posté(e) le 12 juillet 2015 J'ai finalement utilisé SimpleXML qui fait le taf sans qu'on soit obligé de se prendre la tête ... Merci pour le coup de main ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.