2010-08-19 8 views
0

J'ai regardé des articles similaires tels que this one et je ne peux pas tout à fait le faire fonctionner, tout à fait possible, je suis juste un malentendu. J'ai un script simple qui analyse un peu de xml et imprime des champs spécifiques - ce que j'ai du mal à faire, c'est accéder aux données des objets SimpleXMLElement.Accéder à SimpleXMLElements dans un tableau

XML (simplifié pour plus de clarté)

<channel> 
    <item> 
    <title><![CDATA[Title is in here ...]]></title> 
    <description>Our description is in here!</description> 
    </item> 
</channel> 

PHP

$url = "file.xml"; 
$xml = simplexml_load_file($url, 'SimpleXMLElement', LIBXML_NOCDATA); 

foreach ($xml->channel->item as $item) { 
$articles = array(); 
$articles['title'] = $item->title; 
$articles['description'] = $item->description; 
} 

Jusqu'à ce point, tout semble correct. Je me retrouve avec un tableau de contenu que je peux confirmer avec print_r, ce que je reviens:

Array 
(
    [title] => SimpleXMLElement Object 
     (
      [0] => Title is in here ... 
     ) 

    [description] => SimpleXMLElement Object 
     (
      [0] => Our description is in here! 
     ) 
) 

La question clé

Comment puis-je alors accès [titre] [0] ou [description] [0]?

J'ai essayé quelques variantes sans succès, probablement une erreur de débutant quelque part!

foreach ($articles as $article) { 
     echo $article->title; 
    } 

et

foreach ($articles as $article) { 
     echo $article['title'][0]; 
    } 

et

foreach ($articles as $article) { 
     echo $article['title']; 
    } 
+0

Y at-il une raison particulière pourquoi voulez-vous bourrer chaque $ item-> title et $ item-> description dans un tableau? C'est à dire. pourquoi ne pouvez-vous pas simplement utiliser le simplexmlelement là où vous en avez besoin? – VolkerK

+0

Il y aura probablement de nombreux jeux de titres/descriptions - je veux les rassembler puis les parcourir avec un autre processus ... si cela ressemble à un mauvais processus bien que j'adorerais d'autres suggestions :) – suitedupgeek

Répondre

1

Si vous ne voulez vraiment pas passer simplement le SimpleXMLElement mais mettre les valeurs dans un tableau premier ....

<?php 
// $xml = simplexml_load_file($url, 'SimpleXMLElement', LIBXML_NOCDATA); 
$xlm = getData(); 

$articles = array(); 
foreach ($xml->channel->item as $item) { 
    // with (string)$item->title you get rid of the SimpleXMLElements and store plain strings 
    // but you could also keep the SimpleXMLElements here - the output is still the same. 
    $articles[] = array(
    'title'=>(string)$item->title, 
    'description'=>(string)$item->description 
); 
} 

// .... 
foreach($articles as $a) { 
    echo $a['title'], ' - ', $a['description'], "\n"; 
} 

function getData() { 
    return new SimpleXMLElement('<foo><channel> 
    <item> 
     <title><![CDATA[Title1 is in here ...]]></title> 
     <description>Our description1 is in here!</description> 
    </item> 
    <item> 
     <title><![CDATA[Title2 is in here ...]]></title> 
     <description>Our description2 is in here!</description> 
    </item> 
    </channel></foo>'); 
} 

impressions

Title1 is in here ... - Our description1 is in here! 
Title2 is in here ... - Our description2 is in here! 
+0

Nailed it. Je ne savais pas à propos de (chaîne) $ objet-> valeur ... très utile. – suitedupgeek

0

Je pense que vous avez une erreur lorsque vous attribuez la valeur à la gamme:

foreach ($xml->channel->item as $item) { 
    $articles = array(); 
    $articles['title'] = $item->title; 
    $articles['description'] = $item->description; 
} 

si vous avez foreach pourquoi sont votre création à chaque étape nouveau tableau $ articles = array();

$articles = array(); 
foreach ($xml->channel->item as $item) { 
     $articles['title'] = $item->title; 
     $articles['description'] = $item->description; 
} 
+0

Même alors vous obtenez seulement un maximum d'un article étant donné que l'itération suivante écrase les anciennes valeurs. – VolkerK

+0

Tout à fait raison, j'ai seulement testé avec un ensemble de valeurs jusqu'à présent - la question principale se tient toujours malgré mon code de merde :) – suitedupgeek