Question

J'utilise simpleXML pour analyser ce xml fichier . Il est un aliment que je utilise pour accéder à l'API YouTube. Je veux intégrer la plus récente vidéo dans un objet et afficher les quatre vignettes.

J'utilise simplexml_load_file sur ce point, allant en utilisant une boucle de foreach pour accéder aux valeurs de chaque aliment.

Je peux accéder aux valeurs pas de problème, mais je courir dans le problème qu'il stocke chaque vidéo dans une SimpleXMLElement Object séparée. Je n'ai aucun contrôle sur l'objet que je l'accès car ils ne sont pas stockées dans un tableau. Donc, je ne peux pas, par exemple, $thumb[4] ou $entry[4]->thumb.

J'ai essayé d'utiliser SimpleXMLIterator, mais pour une raison quelconque, les valeurs qui ont le même début que blanc rends. Par exemple, la vidéo pourrait avoir onze variations de:

Et ceux-ci rendraient chacun comme [1]="", [2]="", [3]="", etc.

Je vais heureusement fournir quelques informations supplémentaires à tous ceux qui peuvent aider!

Modifier

Voici le print_r de mes résultats. Cela se fait sur une seule variable pour vous donner une idée de la question de la structure que je suis face. L'ensemble print_r (entrée de $) donnerait des variables pour chaque nœud dans le fichier XML.

SimpleXMLElement Object
(
    [0] => 159
)
SimpleXMLElement Object
(
    [0] => 44
)

En outre, le print_r est simplement à l'intérieur du bloc de PHP pour les tests. Je suis à la recherche d'accéder aux variables dans les échos dans le code HTML.

Était-ce utile?

La solution

Vous avez couru dans le problème de href="http://devzone.zend.com/article/688#Heading3" et SimpleXML . L'alimentation commence par

<feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007'>

Le xmlns='http://www.w3.org/2005/Atom' définit l'espace de noms par défaut http://www.w3.org/2005/Atom. C'est à dire. ses éléments enfants ne sont pas vraiment id, updated, category mais http://www.w3.org/2005/Atom:id, http://www.w3.org/2005/Atom:updated et ainsi de suite ...
Donc, vous ne pouvez pas accéder au l'élément identifiant via $feed->id, vous avez besoin de la méthode SimpleXMLElement :: enfants () . Il vous permet de spécifier l'espace de noms des éléments de l'enfant que vous souhaitez récupérer.

Par exemple,

$feed = simplexml_load_file('http://gdata.youtube.com/feeds/api/videos?author=ofcoursegolf&max-results=5&prettyprint=true');
$children = $feed->children('http://www.w3.org/2005/Atom');
echo $children->updated;

imprime actuellement 2010-02-06T05:23:33.858Z.

Pour obtenir l'identifiant du premier élément d'entrée, vous pouvez utiliser echo $children->entry[0]->id;.
Mais alors vous tomberez sur l'élément <media:group> et ses enfants <media:category, <media:player> et ainsi de suite ..., qui sont dans l'espace de noms xmlns:media='http://search.yahoo.com/mrss/'.

$feed = simplexml_load_file('http://gdata.youtube.com/feeds/api/videos?author=ofcoursegolf&max-results=5&prettyprint=true');
$group = $feed->children('http://www.w3.org/2005/Atom')
  ->entry[0]
  ->children('http://search.yahoo.com/mrss/')
  ->group
  ->children('http://search.yahoo.com/mrss/')
;
echo $group->player->attributes()->url, "\n";
foreach( $group->thumbnail as $thumb) {
  echo 'thumb: ', $thumb->attributes()->url, "\n";
}

prints (Actuellement)

http://www.youtube.com/watch?v=ikACkCpJ-js&feature=youtube_gdata
thumb: http://i.ytimg.com/vi/ikACkCpJ-js/2.jpg
thumb: http://i.ytimg.com/vi/ikACkCpJ-js/1.jpg
thumb: http://i.ytimg.com/vi/ikACkCpJ-js/3.jpg
thumb: http://i.ytimg.com/vi/ikACkCpJ-js/0.jpg

Modifier. Je serais probablement le faire dans le navigateur avec JavaScript beaucoup plus, mais voici une (simple, laid) exemple d'application

<?php
//define('TESTENV' , true);
function getFeed($author) {
  // <-- add caching here if needed -->
  if ( !defined('TESTENV') ) {
    $url = sprintf('http://gdata.youtube.com/feeds/api/videos?author=%s&max-results=5',
      urlencode($author)
    );
  }
  else {
    $url = 'feed.xml';
  }
  return simplexml_load_file($url);
}
$feed = getFeed('jonlajoie');

if ( !isset($_GET['id']) ) {
  $selected = '';
}
else {
  $selected =  $_GET['id'];
  printf ('
    <object width="425" height="344">
      <param name="movie" value="http://www.youtube.com/v/%s"></param>
      <param name="allowFullScreen" value="true"></param>
      <param name="allowscriptaccess" value="always">
      </param>
      <embed src="http://www.youtube.com/v/%s" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed>
    </object>',
    htmlspcialchars($selected), htmlspcialchars($selected)
  );
}

$item = 0;
foreach( $feed->children('http://www.w3.org/2005/Atom')->entry as $entry ) {
  $entryElements = $entry->children('http://www.w3.org/2005/Atom');
  $groupElements = $entry
    ->children('http://search.yahoo.com/mrss/')
    ->group
    ->children('http://search.yahoo.com/mrss/')
  ;

  if ( !preg_match('!^http://gdata.youtube.com/feeds/api/videos/([^/]+)!', $entryElements->id, $m) ) {
    // google can choose whatever id they want. But this is only a simple example....
    die('unexpected id: '.htmlspecialchars($entryElements->id));
  }
  $id = $m[1];
  if ( $selected!==$id ) {
    printf('<a href="?id=%s"><img src="%s" /></a>',
      urlencode($id),
      $groupElements->thumbnail[0]->attributes()->url
    );
  }
}

Edit 2: «Et quand je clique sur les vignettes, je vais utiliser jQuery pour charger la vidéo dans l'espace principal semble que je vais avoir besoin d'un accès précis au noeud [#], non? »
Si vous utilisez déjà votre script PHP JavaScript / JQuery (si besoin en est) pourrait tout simplement retourner un tableau (JSON codé) de toutes les données pour toute la vidéo et votre script jQuery pourrait comprendre quoi faire avec les données.

Autres conseils

$doc = new DOMDocument();
$doc->loadXML(file_get_contents('http://gdata.youtube.com/feeds/api/videos?author=ofcoursegolf&max-results=5&prettyprint=true'));
$xpd = new DOMXPath($doc);
$xpd->registerNamespace('atom', "http://www.w3.org/2005/Atom");
false&&$node = new DOMElement();//this is for my IDE to have intellysense

$result = $xpd->query('//atom:feed/atom:entry[1]/media:group/media:thumbnail');
foreach($result as $node){
    echo $node->getAttribute('url').'<br />';
}

echo "more results <br />";
$result = $xpd->query('//atom:feed/atom:entry[1]/media:group/media:thumbnail[1]');
foreach($result as $node){
    echo $node->getAttribute('url').'<br />';
}

Essayez $sxml->entry[4]->thumb ou quelque chose à cet égard.

Alias, pour accéder au premier ID entrées, vous allez $sxml->entry[4]->id

Fondamentalement $sxml->entry est un tableau de SimpleXMLElement Objects. Lorsque vous les foreach, vous allez à travers chaque objet et l'assigner à $entry, de sorte que $entry = $sxml->entry[0] et vers le haut.

Vous pouvez aller comme ceci:

print_r($sxml);

voir la structure. Et qui vous dira ce que vous devez utiliser pour y accéder.

En fin de compte, je l'ai fait deux boucles foreach, une course à travers un flux XML montrant le plus récent une entrée . Puis, je répétai sur l'objet autour de cela pour jouer le vide.

Dans l'autre, je courais à travers les quatre derniers entrées, le retour des éléments de la liste pour une liste de vignettes.

Maintenant, quand je clique sur une vidéo miniature, javascript poignées en passant les paramètres à l'entrée principale. Maintenant, comment recharger cet objet principal lors de la réception des paramètres, je suis ouvert aux idées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top