SimpleXML Birden fazla nesne dönen, nasıl veri alabilirim?

3 Cevap php

I this xml file ayrıştırmak için SimpleXML kullanıyorum. Ben YouTube API erişmek için kullanıyorum bir besleme bulunuyor. Ben bir nesne en son video embed ve önümüzdeki dört küçük resimlerini görüntülemek isterseniz.

Yani, bu konuda simplexml_load_file kullanarak her yeminde değerlerine erişmek için bir foreach döngü kullanarak gidiyorum.

Ben hiçbir sorun değerlere erişebilir, ama ben ayrı bir SimpleXMLElement Object her videoyu saklayan sorun haline çalıştırmak. Ben bir dizide saklanır değil gibi ben erişen ediyorum hangi nesne üzerinde herhangi bir kontrol yok. Yani, diyelim ki, olsun $thumb[4] veya $entry[4]->thumb olamaz.

I SimpleXMLIterator kullanmaya çalıştı, ama ne sebeple olursa olsun, aynı başlangıcını herhangi değerleri boş kılıyor. Örneğin, video onbir varyasyonları olabilir:

Ve bu her [1]="", [2]="", [3]="", vb kılacak

Ben mutlu yardımcı olabilecek herkese biraz daha bilgi vereceğiz!

Edit

İşte benim sonuçlar print_r olduğunu. Bu size ben bakan değilim yapı sorunu hakkında bir fikir vermek için, tek bir değişken üzerinde yapılır. Tüm print_r ($ girdi) XML dosyasında her düğüm için değişkenler verecek.

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

Ayrıca, print_r test için PHP bloğunun içinde basitçe. Aslında HTML yankılar içindeki değişkenleri erişmek için arıyorum.

3 Cevap

Sen sorun koştu namespaces and SimpleXML. Besleme ile başlar

<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'>

The xmlns='http://www.w3.org/2005/Atom' sets the default namespace to http://www.w3.org/2005/Atom. I.e. its child elements are not really id, updated, category but http://www.w3.org/2005/Atom:id, http://www.w3.org/2005/Atom:updated and so on...
So you can't access the the id element via $feed->id, you need the method SimpleXMLELement::children(). It lets you specify the namespace of the child elements you want to retrieve.

Örneğin,

$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;

Şu anda yazdırır 2010-02-06T05:23:33.858Z.

To get the id of the first entry element you can use echo $children->entry[0]->id;.
But then you'll hit the <media:group> element and its children <media:category, <media:player> and so on..., which are in the xmlns:media='http://search.yahoo.com/mrss/' namespace.

$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";
}

(Şu anda) baskılar

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

Düzenleme: Ben muhtemelen çok daha fazla JavaScript ile tarayıcı içinde, ama burada bir (basit, çirkin) örnek uygulaması olduğunu yapardım.

<?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: "And when I click the thumbnails, I'll use jQuery to load the video in the main space. Seems like I'll need precise access to node[#], right?"
If you're already using JavaScript/jQuery your PHP script (if needed at all) could simply return a (JSON encoded) array of all the data for all the video and your jQuery script could figure out what to do with the data.

$sxml->entry[4]->thumb veya bu konuda bir şey deneyin.

AKA, ilk girişleri kimliğini erişmek için, gitmek istiyorum $sxml->entry[4]->id

Temelde $sxml->entry SimpleXMLElement Object s bir dizidir. Bunları foreach zaman, $entry, yukarı böylece $entry = $sxml->entry[0] ve her nesne geçiyor ve bunu atama.

Böyle gidebilirsiniz:

print_r($sxml);

TÜM yapısını görmek için. Ve bu onu erişmek için kullanmak gerekenleri söyleyecektir.

Sonunda, ben iki foreach döngüleri, en son one girişini gösteren bir XML beslemesi ile çalışan bir tane yaptım. Sonra, ben vide oynamak için bu etrafında nesneyi dışarı yankılandı.

Diğerinde ise, ben küçük bir listesi için liste öğeleri dönen, en son dört girişleri ile koştu.

Ben bir küçük video tıklayın Şimdi, ne zaman, javascript kolları ana giriş parametreleri geçirerek. Şimdi, parametreleri aldıktan sonra o ana nesneyi yeniden nasıl, ben fikirlere açığım.