[PHP] Odwołanie się do podanych wartości w XML

Witam. 

Otwórz XMLa w dowolnym edytorze XML albo z braku laku w IE. Zobaczysz ustrukturyzowaną wersję dokumentu, mniej więcej taką:

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:gd="http://schemas.google.com/g/2005" xmlns:media="http://search.yahoo.com/mrss/" xmlns="http://www.w3.org/2005/Atom">
  <id>http://gdata.youtube.com/feeds/api/users/K7s6Tel7XVRVBryn8GM3Rg</id>
  <published>2012-06-25T14:35:52.000Z</published>
  <updated>2014-05-23T13:35:37.000Z</updated>
  <category term="http://gdata.youtube.com/schemas/2007#userProfile" scheme="http://schemas.google.com/g/2005#kind"/>
  <title type="text">BeerCoasterTV</title>
  <content type="text"/>
  <link type="text/html" href="http://www.youtube.com/channel/UCK7s6Tel7XVRVBryn8GM3Rg" rel="alternate"/>
  <link type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/users/K7s6Tel7XVRVBryn8GM3Rg" rel="self"/>
  <author>
    <name>BeerCoasterTV</name>
    <uri>http://gdata.youtube.com/feeds/api/users/BeerCoasterTV</uri>
  </author>
  <gd:feedLink href="http://gdata.youtube.com/feeds/api/users/beercoastertv/subscriptions" rel="http://gdata.youtube.com/schemas/2007#user.subscriptions" countHint="0"/>
  <gd:feedLink href="http://gdata.youtube.com/feeds/api/users/beercoastertv/contacts" rel="http://gdata.youtube.com/schemas/2007#user.contacts" countHint="0"/>
  <gd:feedLink href="http://gdata.youtube.com/feeds/api/users/beercoastertv/inbox" rel="http://gdata.youtube.com/schemas/2007#user.inbox"/>
  <gd:feedLink href="http://gdata.youtube.com/feeds/api/users/beercoastertv/playlists" rel="http://gdata.youtube.com/schemas/2007#user.playlists"/>
  <gd:feedLink href="http://gdata.youtube.com/feeds/api/users/beercoastertv/uploads" rel="http://gdata.youtube.com/schemas/2007#user.uploads" countHint="9"/>
  <gd:feedLink href="http://gdata.youtube.com/feeds/api/users/beercoastertv/newsubscriptionvideos" rel="http://gdata.youtube.com/schemas/2007#user.newsubscriptionvideos"/>
  <yt:location>PL</yt:location>
  <yt:statistics totalUploadViews="4772" viewCount="0" videoWatchCount="0" subscriberCount="42" lastWebAccess="1970-01-01T00:00:00.000Z"/>
  <media:thumbnail url="http://i1.ytimg.com/i/K7s6Tel7XVRVBryn8GM3Rg/1.jpg?v=53654ef2"/>
  <yt:username>beercoastertv</yt:username>
</entry>

Węzeł entry ma wiele dzieci: id, published, updated, itd. Jedno z dzieci entry - author - ma swoje dzieci: name, uri. To ma na myśli dokumentacja pisząc o “children (dzieci) of a given node (węzła)”.

Dokument tak po prawdzie zawiera kilka struktur w różnych przestrzeniach nazw:

xmlns:yt="http://gdata.youtube.com/schemas/2007"

xmlns:gd="http://schemas.google.com/g/2005"

xmlns:media="http://search.yahoo.com/mrss/"

xmlns="http://www.w3.org/2005/Atom"

Jeśli z dokumentu odczytasz dzieci z przestrzeni ‘tutaj_jeden_z_urli’, to uzyskasz widok na jedną z przestrzeni (w przypadku Twojego przykładu - media). Ten parametr jest opcjonalny, dodam. Twój subscriberCount jest w przestrzeni yt. Ja tutaj URLa awatara nie widzę - pewnie musisz pobrać inny dokument mając id albo yt:username. Powodzenia!

Dziękuję ! To bardzo ułatwiło sprawę. Napisałem coś takiego :

 

$authorFeed = simplexml_load_file("http://gdata.youtube.com/feeds/api/users/BeerCoasterTV");    
 $authorData = $authorFeed->children('http://gdata.youtube.com/schemas/2007');
 $attrs = $authorData->statistics->attributes();
 $obj->subcriberCount = $attrs['subsriberCount'];

 

i wyskakuje błąd 

 

Fatal error: Call to a member function attributes() on a non-object in D:\Programy\Xampp\htdocs\Test\test.php on line 43

Lecz wcześniejszy zapis dotyczący video a nie autora nie wykazuje błędu (kod ściągnięty z internetu) : 

 

$yt = $entry->children('http://gdata.youtube.com/schemas/2007');
      $attrs = $yt->statistics->attributes();
      $obj->viewCount = $attrs['viewCount']; 

gdzie $entry to w przełożeniu to samo co $authorFeed.

 

 

Jaka jest różnica między tymi dwoma zapisami?

 

URL do XML`a video - http://gdata.youtube.com/feeds/api/videos/M-_CIlI2m94

Kombinowanie nie boli. :wink: Bez czytania dokumentacji można rozwiązać to w kilka minut eksperymentując. Chyba, bo u mnie (PHP 5.5.11) działa np. to:

 

<?php

$authorFeed = simplexml_load_file("http://gdata.youtube.com/feeds/api/users/BeerCoasterTV");    
$authorData = $authorFeed->children('http://gdata.youtube.com/schemas/2007');
$st = $authorData->statistics->attributes();
$subs = $st->subscriberCount;
echo $subs;