2010-10-27 5 views
2

J'ai un SimpleXMLElement pour lequel je lis dans un fichier XML en utilisant curl. En essayant d'en extraire les valeurs, j'ai besoin d'utiliser un foreach imbriqué, mais dans une situation similaire, j'ai pu le faire en une fois. Maintenant, je suis vraiment curieux de savoir pourquoi cela ne fonctionne pas:Le bouclage à travers l'objet SimpleXMLElement ne fonctionne qu'en 2 étapes

Son délicieux flux RSS;

SimpleXMLElement Object 
(
    [title] => Delicious/chrisvdberge 
    [link] => http://www.delicious.com/chrisvdberge 
    [description] => bookmarks posted by chrisvdberge 
    [item] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [title] => Diagrammr 
        [pubDate] => Thu, 06 May 2010 12:40:07 +0000 
        [guid] => http://www.delicious.com/url/2fc2ed0e870ec9d001b645dfaed0e771#chrisvdberge 
        [link] => http://www.diagrammr.com/ 
        [comments] => http://www.delicious.com/url/2fc2ed0e870ec9d001b645dfaed0e771 
        [source] => chrisvdberge's bookmarks 
        [category] => Array 
         (
          [0] => tagthis 
          [1] => visualization 
          [2] => diagrams 
         ) 

       ) 

      [1] => SimpleXMLElement Object 
       (
        [title] => Ignite Toronto 2: Ryan Coleman - Designing for visual efficiency on Vimeo 
        [pubDate] => Mon, 18 Jan 2010 08:05:06 +0000 
        [guid] => http://www.delicious.com/url/9a0de307f3f37baaa25ad20b4dbc4537#chrisvdberge 
        [link] => http://vimeo.com/8317770 
        [comments] => http://www.delicious.com/url/9a0de307f3f37baaa25ad20b4dbc4537 
        [source] => chrisvdberge's bookmarks 
        [category] => Array 
         (
          [0] => tagthis 
          [1] => vizthink 
         ) 

       ) 

etc.

Je peux accéder à tous les liens en utilisant un foreach imbriqué:

foreach ($delicious_res as $item) { 
    foreach ($item->item as $entry){ 
     echo $entry->link."<br />"; 
    } 
} 

Mais je ne comprends pas pourquoi je ne peux pas utiliser ce (que je peux dans une autre situation J'aime vraiment comprendre pourquoi dans le but de mieux comprendre SimpleXML en général;)

Répondre

1

Vous devez utiliser:

foreach($delicious_res->channel->item as $item) { 
    print_r($item); 
} 

Parce que la collection d'éléments est dans la balise <rss> et <channel> (la balise <rss> peut être omis car il est le nœud racine du document). Sur une autre note: si vous ne faites rien de fantaisie, vous n'avez probablement pas besoin d'utiliser curl pour récupérer le contenu xml des flux RSS. Il suffit d'utiliser simplexml_load_file avec l'url comme argument:

$delicious_res = simplexml_load_file('http://path-to-your/file.xml"'); 
+0

thx beaucoup! Quels seraient les trucs «fantaisistes» pour lesquels Id a besoin de rouler? et simplexml_load_file est-il plus rapide? – Chrisvdberge

+0

@Chrisvdberge Eh bien, des trucs de fantaisie serait e. g. en utilisant une requête POST pour récupérer les données. Lorsque vous utilisez POST, vous devez utiliser curl. Curl est normalement utilisé pour faire des requêtes http plus complexes, dans votre cas, vous pouvez le faire beaucoup plus simple. Les performances devraient être à peu près les mêmes, mais le code est beaucoup plus agréable à lire au lieu des nombreux appels curl_setopt(). :-) – Max