Problème de boucle foreach PHP-XML ?

10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012 - 1 janv. 2010 à 19:56
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012 - 6 janv. 2010 à 18:26
bonjour à tous et bonne année 2010

voila j'ai un petit problème avec ma boucle "do-while" je souhaiterai afficher uniquement les 10 premier article de mon fichier XML pourtant il me semble oublier quelque chose car cela ne fonctionne pas ???

voici mon code PHP

<?php
$fichier = "news.xml";
$dom = new DOMDocument();


if (!$dom->load($fichier)) 
{
    die('Impossible de charger le fichier XML');
}

$count = 0;
do{


$itemList = $dom->getElementsByTagName('element');


foreach ($itemList as $item) {

$count = $count + 1;

    $titre = $item->getElementsByTagName('titre');
    
    if ($titre->length > 0) 
    {
        echo $titre->item(0)->nodeValue;
    } 
    else 
    {
        echo '(sans titre)';
    }
  
    echo '
'."\n";

    $desc = $item->getElementsByTagName('date');
    if ($desc->length > 0) 
    {
        echo ' '.$desc->item(0)->nodeValue.'

'."\n";
    }
    
    $desc = $item->getElementsByTagName('content');
    if ($desc->length > 0) 
    {
        echo ' '.$desc->item(0)->nodeValue.'
'."\n";
    }
    
    
    
    $lien = $item->getElementsByTagName('classeur');
    if ($lien->length >0)
    {
        echo ' ['.$lien->item(0)->nodeValue.'  + (photos, docs,&#8230;)]';
    }

    echo '

----------------------------------------------------------

'."\n";
  }
  
}while ($count <11)
 

?>


et un fichier XML de ce genre


<xmlfile>

<titre>mon titre</titre>
<date>01/01/10</date>
<content>mon content</content>
<classeur>les photos ici</classeur>


<titre>mon titre 2</titre>
<date>02/01/10</date>
<content>mon content le retour</content>
<classeur>les photos ici</classeur>

</xmlfile>


si quelqu'un à une suggestion je suis preneur :)

4 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
5 janv. 2010 à 23:38
Salut et bonne année également,

Tout d'abord, je continue de penser comme dans mon précédent message, que tu devrais encapsuler les éléments correspondant à un item (je ne sais pas si c'est un article ou autre chose). XML est un langage de DESCRIPTION de données. Ton fichier, tel que tu nous le présente, décrit bien les différents items, mais ne les hiérarchise pas ; or c'est indispensable : comment savoir que tel titre correspond à tel item, et un autre titre à un autre item ? Là, on pourrait légitimement penser que l'item intitulé "mon titre" est associé à la date 02/01/10 : la règle comme quoi une nouvelle balise titre implique que les balises suivantes décrivent un nouvel item n'est pas écrite... Et justement, l'exemple que je donnais n'était rien de plus que l'écriture de cette règle, qui permet de savoir que telles balises décrivent tel item, telles autres tel autre item.

Sinon, les balises HTML dans l'élément <classeur> sont probablement mal interprétées, du fait que le parser DOM va les considérer comme des balises XML.
Pour éviter cela, il faut préciser au parser qu'il s'agit de données :
<classeur><![CDATA[[ .....]]]></classeur>


Ce n'est peut-être pas la seule erreur, mais c'est celle que je vois là tout de suite... Il faudrait préciser ce qui ne fonctionne pas plus précisément, parce que "ça ne fonctionne pas" ce n'est pas très parlant... Est-ce qu'il y a un message d'erreur, que se passe-t-il d'inattendu, qu'attends-tu, ... ?

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012
5 janv. 2010 à 23:53
Je te remercie pour ton message

Je te reassure ,en éffet j'ai encapsuler le fichier XML comme tu me l'avais conseillé et cela fonctionne très bien(j'ai juste fait un copier coller de mon précédent poste méacoulpa ^^)

Pour le classeur il ne me poste aucun problème non plus de ce côté là non il s'agissait vraiment d'un problème de boucle.

J'ai remplacé mon do-while par un if ($count <11) et cela fonctionne ;)

mon fichier xml est de ce type

<xmlfile>

<element id="24">
<titre>mon titre</titre>
<date>01/01/10</date>
<content>mon content</content>
<classeur>les photos ici</classeur>
</element>

</xmlfile>



mais mon but est surtout de gérer l'affichage comme tu la deviné " des articles " certainement cela peut être possible par la balise <element> mais je vois pas comment dans le détail ?

(example: de FaceBook => "afficher plus" et il affiche 10 articles précédents supplémentaires)
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
6 janv. 2010 à 00:06
Sinon, il doit être possible de parcourir les éléments i à j (i et j étant variables en fonction de ceux que tu souhaites afficher) avec une boucle for.
La méthode getElementsById() retourne une instance de DOMNodeList, et on peut accéder à chaque élément par son index. Donc pour afficher les 10 éléments les plus récents (en toute logique, ceux d'indice 0 à 9, puisqu'ils doivent être les plus premiers de ton fichier XML), on doit pouvoir faire comme ça :
$itemList = $dom->getElementsByTagName('element');
for ($i=0 ; $i<10 ; $i++) {
  $item = $itemList -> item($i);
  // etc
}


Inutile d'utiliser foreach si tu ne parcours pas l'intégralité des éléments ;)

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012
6 janv. 2010 à 18:26
Merci beaucoup pour ta collaboration tous fonctionne correctement ;)
0
Rejoignez-nous