Récupérer une seule balise d'un XML

StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   -  
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'ai un fichier xml à parser à l'aide d'un code PHP.
Le problème est qu'il possède 3 balises "description" à différents endroits du fichier, j'affiche les 3 alors que je ne veux afficher que les 2 premières.
Je ne sais comment faire. Merci de votre aide.
A voir également:

20 réponses

jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Salut !

https://www.php.net/manual/fr/simplexmlelement.construct.php

Donc :
$xml = new SimpleXMLElement('monfichier.xml');

print_r($xml->description[0]);
print_r($xml->description[1]);
0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de ta réponse. Cependant en testant ton code je reçois l'erreur suivante:


This page contains the following errors:

error on line 11 at column 3: Extra content at the end of the document
Below is a rendering of the page up to the first error.
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Salut !

Je ne connais pas spécialement l'objet,, mais envois la structure de ton fichier xml :)
Je pense qu'il faut d'abord prendre les balises du noeud au dessus de description, si il y en a !
0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
EDIT:

J'ai maintenant une page rempli d'erreur avec des tableaux de variables ci dessous:


Warning: SimpleXMLElement::__construct() [<a href='simplexmlelement.--construct'>simplexmlelement.--construct</a>]: Entity: line 1: parser error : Start tag expected, '<' not found in C:\wamp\www\tests\example02.php on line 4



Warning: SimpleXMLElement::__construct() [<a href='simplexmlelement.--construct'>simplexmlelement.--construct</a>]: france_0514540.xml in C:\wamp\www\tests\example02.php on line 4




Warning: SimpleXMLElement::__construct() [<a href='simplexmlelement.--construct'>simplexmlelement.--construct</a>]: ^ in C:\wamp\www\tests\example02.php on line 4





Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\wamp\www\tests\example02.php on line 4




( ! ) Exception: String could not be parsed as XML in C:\wamp\www\tests\example02.php on line 4




Voila les 5 erreurs que j'obtiens. C'est pire ! :)
0

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

Posez votre question
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Ah bah il trouve pas ton fichier .xml
Ou ya un probleme avec. Il est bien dans le même dossier que ton fichier php ?
Essaye :
$xml = new SimpleXMLElement('urldufichier.xml', NULL, TRUE);

0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
J'ai trouvé dla doc en plus : http://www.w3schools.com/php/php_xml_simplexml.asp
Regarde les exemples et essaye avec ton cas
0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai essayé en remplaçant avec ton bout de code; j'obtiens ces erreurs-là :


( ! ) Warning: SimpleXMLElement::__construct() [<a href='simplexmlelement.--construct'>simplexmlelement.--construct</a>]: I/O warning : failed to load external entity "france-0514540.xml" in C:\wamp\www\tests\example02.php on line 4


( ! ) Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\wamp\www\tests\example02.php on line 4
( ! ) Exception: String could not be parsed as XML in C:\wamp\www\tests\example02.php on line 4



Oui le fichier XML est dans le même répertoire que mon fichier php..
Dans mes recherches, j'ai essayé aussi SimpleXML_Load_File mais le résultat est le même...
Je précise que dans le XML l'arborescence est assez complexe: Une balise channel contient plusieurs balises item et dans chaque balise item il y a une balise description.
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Le problème est vraiment avec ton fichier .xml ...
failed to load external entity "france-0514540.xml"

Essage un truc du genre :

$x = "<personne><nom>dupond</nom><prenom>jean</prenom></personne>"
$xml = new SimpleXMLElement($x);

echo $xml->personne->nom;


0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Attends, j'avais fait une erreur de frappe et en utilisant la ligne de code que tu m'avais donné avec NULL et TRUE, maintenant c'est une écran blanc qui s'affiche..

Je ne comprends pas le code que tu m'as donné en dernier..
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Ah bah voilà donc il a trouvé ton fichier cool !
Alors mtn après ce que tu m'as dit :
"Une balise channel contient plusieurs balises item et dans chaque balise item il y a une balise description."
Peux tu copier coller une partie de ton fichier xml pour voir la structure précise stp !
0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Pas de soucis:

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Voila Météo Reims]]></title>
<description><![CDATA[Voila Météo]]></description>
<language>fr-fr</language>
<copyright>Voila</copyright>
<generator>METEO</generator>

<pubDate>Mon, 13 May 2013 00:00:01 GMT</pubDate>
<lastBuildDate>Mon, 13 May 2013 12:38:20 +0200</lastBuildDate>
<link>https://meteo.orange.fr/
<ttl>60</ttl>


<item>
<date>lundi 13 mai 2013</date>
<title><![CDATA[lundi 13 mai 2013 après-midi : 16°]]></title>
<description>
<![CDATA[
lundi 13 mai 2013<br/>
<font face="Arial" size="2" color="#444">
<table border="0" cellpadding="0" cellspacing="2">
<tr>
<td>
<img src="https://meteo.orange.fr/" width="40" height="40" border="0" />
</td>
<td valign="middle" align="center" style="vertical-align:middle">
<font size="4" color="#222288" style="line-height:25px;"><b>16 °</b></font><br />
<font face="Arial" size="2" color="#444">Rares averses<br />Vent : <b>20 km/h</b></font>
</td>
</tr>
</table><br/>
<b>Prévisions</b> à <a href="https://meteo.orange.fr/">10 jours</a><br /></font>
]]>
</description>



Je veux récupérer les informations météo qu'il y a dans la balise description à la fin. ( je n'ai pas pris la suite du xml c'est inutile )
0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
PS: quand je teste le code


<?php


$xml = new SimpleXMLElement('france_0514540.xml', NULL, TRUE);
print_r($xml->description);


?>





J'obtiens une page blanche avec seulement écrit "SimpleXMLElement Object ( )"
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Ok ok donc la balise descriptions de chaque <item> c'est ca ?
Ya un bon exemple je trouve ici http://www.w3schools.com/php/php_xml_simplexml.asp

Moi je testerai :

foreach($xml->item as $item)
{
echo $item->asXML(); // Ca te récupère en string le contenu, et j'ai vu que c'était un tableau donc si tu voulais gardé la structure tableau ca devrait le faire
}
0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Je vais étudier le lien que tu m'as envoyé.
En suivant tes conseils, j'execute ce code:

<?php


$xml = new SimpleXMLElement('france_0514540.xml', NULL, TRUE);
foreach($xml->item as $item)
{
echo $item->asXML();
}


?>


Mais là une pageblanche s'affiche.
0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Je sais pas exactement comment me servir d'un foreach, sachant que je veux une balise bien particulière et pas une série de balise..
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Essaye en rentrant dans channel d'abord, voir dans la base rss encore au dessus, mais vu que ya des espaces jsais pas trop comment rentré dedans ... peut être avec le children() de l'exemple du lien. A voir !

$xml = new SimpleXMLElement('france_0514540.xml', NULL, TRUE);
foreach($xml->channel->item as $item)
{
echo $item->asXML();
}


0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
Ah c'est mieux ! La première balise description ne s'affiche plus. cependant une troisième balise description située dans une antre balise "item" s'affiche..
J'avais pensé à un ciblage à la ligne près, ou bien à une extraction de balise..
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Ah bah oui la tu auras les descriptions de chaque balise item ! Donc si tu veux seulement la première c'est plus simple, pas besoin de foreach !

echo $xml->channel->item[0]->asXML();



0
StringTheory Messages postés 11 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai résolu ce problème en rajoutant [0] à la fin de la balise description dans ton code.
Ca s'annonce plutôt bien, tu m'as beaucoup aidé et je t'en remercie ! J'ai encore un double crochet qui s'affiche à enlever et ce sera bon.
0
jeremy.s Messages postés 1226 Date d'inscription   Statut Membre Dernière intervention   79
 
Ok ca marche :)
De toute façon c'est assez simple à comprendre comme objet, tu récupères la balise avec un ->nomDeLaBalise et tu mets des crochets avec un indice si t'en veux un en particulier, mais je vois que t'as compris donc parfait !
0