2 votes

Boucle ne affichant pas les données pour toutes les lignes du fichier XML

J'ai un fichier XML qui a la structure suivante :

Je suis en train d'afficher des données spécifiques issues de ce qui précède.

loadXML($importBuffer);
$xpath = new DOMXpath($dom);
$items = $xpath->query("//item");
$results = parse($items);

$col = $dom->getElementsByTagName('item');

$i = 0;
foreach( $col as $item ){
    $blogTitle=$item->childNodes[1]->nodeValue;
    $blogImage=$item->childNodes[5]->nodeValue;
    $blogDate=$item->childNodes[9]->nodeValue; 
    $blogAuthor=$item->childNodes[11]->nodeValue;

    if(++$i > 4) break;

?>

Je suis en train d'exécuter la boucle pour obtenir des résultats (remarquez if(++$i > 4) break;). Tout le reste fonctionne bien, cependant, le $blogAuthor ne s'affiche que pour le premier élément. L'auteur est vide pour les trois derniers résultats. Pourquoi?

3voto

HerrSerker Points 9005

Votre accès aux childNodes de $item est dangereux.

Cela fonctionnera pour quelque chose comme ceci.

  Titre
  Lien
  Desc
  Encodage
  Date
  Auteur
  Guid
  Date

mais échouera pour ceci

  Titre
  Lien
  Desc
  Encodage
  DateAuteur
  Guid
  Date

Cela est dû au fait que childnodes correspond à l'espace blanc entre les éléments. S'il en manque un (comme ne pas avoir d'espace entre et ), votre comptage échouera.

Il vaut mieux utiliser children

    $blogTitle=$item->children[0]->nodeValue;
    $blogImage=$item->children[2]->nodeValue;
    $blogDate=$item->children[4]->nodeValue; 
    $blogAuthor=$item->children[5]->nodeValue;

ou même mieux avec une requête dom

    $blogTitle=$item->getElementsByTagName('title')->item(0)->nodeValue;
    $blogImage=$item->getElementsByTagName('description')->item(0)->nodeValue;
    $blogDate=$item->getElementsByTagName('pubDate')->item(0)->nodeValue; 
    $blogAuthor=$item->getElementsByTagName('author')->item(0)->nodeValue;

0voto

Thomas Weinert Points 31

L'index des nœuds enfants peut ne pas être le même. Ils peuvent avoir un ordre différent, des nœuds supplémentaires (y compris des commentaires) ou simplement quelques sauts de ligne.

Par défaut, les espaces blancs entre les nœuds seront analysés en nœuds texte. Cela permet à la bibliothèque de conserver le même XML. Vous pouvez définir la propriété DOMDocument::preserveWhiteSpace pour l'éviter.

Vous avez commencé à utiliser Xpath, mais avez ensuite ignoré les résultats. Les expressions Xpath vous permettent un accès plus ciblé aux nœuds XML.

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
// récupérer tous les nœuds item et limiter aux 4 premiers
$items = $xpath->evaluate("(//item)[position() < 5]");

foreach ($items as $index => $item) {
    // convertir le premier nœud enfant title en chaine de caractères - vide s'il n'est pas trouvé
    $blogTitle = $xpath->evaluate('string(title)', $item);

    // ...   
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X