Доступ к узлам двоеточия пространства имен в XML с помощью SimpleXML PHP - PullRequest
0 голосов
/ 28 июля 2011

Это похоже на вопрос, который я опубликовал, но я его расширил, потому что это должно быть решаемо.

Я пытаюсь получить доступ к рейтингу и viewCount из этого канала RSS.Теперь они имеют пространство имен с помощью yt: и gd: - однако ссылки на пространство имен - это 404-й канал из ленты youtube, так что, похоже, он не работает.Любая помощь, пожалуйста, пожалуйста?

Я пытаюсь использовать: -

$ytFeed->children('http://gdata.youtube.com/schemas/2007')->statistics->attributes('viewCount'));

Но это не удается ... Он работает как обычно, например, я могу получить доступ к медиа: с

$ytFeed->children('http://search.yahoo.com/mrss/')->group->category);

Это оригинальный RSS, посмотрите внизу для этих узлов: -

<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007'>
    <id>http://gdata.youtube.com/feeds/api/videos/tDJFDsZFw2E</id>
    <published>2009-03-02T07:02:49.000Z</published>
    <updated>2011-07-19T06:57:29.000Z</updated>
    <category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video' />
    <category scheme='http://gdata.youtube.com/schemas/2007/categories.cat' term='Music' label='Music' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Other Lives' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Jesse Tabish' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Jenny Hsu' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Jupiter Hotel' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='Portland' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='music' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='band' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='interview' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='mf magazine' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='fashion' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='hotel room' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='doug fir lounge' />
    <category scheme='http://gdata.youtube.com/schemas/2007/keywords.cat' term='erik schultz' />
    <title type='text'>Other Lives</title>
    <content type='text'>We sat down with Jesse Tabish and Jenny Hsu from Other Lives at the Jupiter Hotel in Portland, OR. We love these guys. Check them out at myspace.com/otherlivesVisit mf magazine at musicfashionmagazine.com or myspace.com/musicfashion</content>
    <link rel='alternate' type='text/html' href='http://www.youtube.com/watch?v=tDJFDsZFw2E&amp;feature=youtube_gdata' />
    <link rel='http://gdata.youtube.com/schemas/2007#video.responses' type='application/atom+xml' href='http://gdata.youtube.com/feeds/api/videos/tDJFDsZFw2E/responses' />
    <link rel='http://gdata.youtube.com/schemas/2007#video.related' type='application/atom+xml' href='http://gdata.youtube.com/feeds/api/videos/tDJFDsZFw2E/related' />
    <link rel='self' type='application/atom+xml' href='http://gdata.youtube.com/feeds/api/videos/tDJFDsZFw2E' />
    <author>
        <name>mfmagazine</name>
        <uri>http://gdata.youtube.com/feeds/api/users/mfmagazine</uri>
        </author>
    <gd:comments>
        <gd:feedLink href='http://gdata.youtube.com/feeds/api/videos/tDJFDsZFw2E/comments' countHint='16' />
        </gd:comments>
    <media:group>
        <media:category label='Music' scheme='http://gdata.youtube.com/schemas/2007/categories.cat'>Music</media:category>
        <media:content url='http://www.youtube.com/v/tDJFDsZFw2E?f=videos&amp;app=youtube_gdata' type='application/x-shockwave-flash' medium='video' isDefault='true' expression='full' duration='600' yt:format='5' />
        <media:content url='rtsp://v3.cache3.c.youtube.com/CiILENy73wIaGQlhw0XGDkUytBMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp' type='video/3gpp' medium='video' expression='full' duration='600' yt:format='1' />
        <media:content url='rtsp://v6.cache3.c.youtube.com/CiILENy73wIaGQlhw0XGDkUytBMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp' type='video/3gpp' medium='video' expression='full' duration='600' yt:format='6' />
        <media:description type='plain'>We sat down with Jesse Tabish and Jenny Hsu from Other Lives at the Jupiter Hotel in Portland, OR. We love these guys. Check them out at myspace.com/otherlivesVisit mf magazine at musicfashionmagazine.com or myspace.com/musicfashion</media:description>
        <media:keywords>Other Lives, Jesse Tabish, Jenny Hsu, Jupiter Hotel, Portland, music, band, interview, mf magazine, fashion, hotel room, doug fir lounge, erik schultz</media:keywords>
        <media:player url='http://www.youtube.com/watch?v=tDJFDsZFw2E&amp;feature=youtube_gdata_player' />
        <media:thumbnail url='http://i.ytimg.com/vi/tDJFDsZFw2E/0.jpg' height='240' width='320' time='00:05:00' />
        <media:thumbnail url='http://i.ytimg.com/vi/tDJFDsZFw2E/1.jpg' height='90' width='120' time='00:02:30' />
        <media:thumbnail url='http://i.ytimg.com/vi/tDJFDsZFw2E/2.jpg' height='90' width='120' time='00:05:00' />
        <media:thumbnail url='http://i.ytimg.com/vi/tDJFDsZFw2E/3.jpg' height='90' width='120' time='00:07:30' />
        <media:title type='plain'>Other Lives</media:title>
        <yt:duration seconds='600' />
        </media:group>
    <gd:rating average='5.0' max='5' min='1' numRaters='17' rel='http://schemas.google.com/g/2005#overall' />
    <yt:statistics favoriteCount='10' viewCount='3572' />
    </entry>

Ответы [ 3 ]

5 голосов
/ 23 ноября 2013

Хорошо, первая проблема в том, что вы неправильно используете метод attributes:

$simpleXML->statistics->attributes('viewCount'));

в приведенном выше (перефразированном из вашего примера) вы передаете имя нужного вам атрибута, а не тот параметр, который attributes принимает. Вместо этого вышеприведенное будет возвращать все атрибуты элемента statistics, где сам атрибут имеет пространство имен viewCount, поскольку метод ожидает, что первый параметр, если он задан, будет пространством имен атрибута.

Ваш код работал бы, если бы вы вместо этого обращались к атрибутам как к массиву элемента, например:

$ytFeed->children('http://gdata.youtube.com/schemas/2007')->statistics['viewCount'];

Если вы хотите избегать использования полного URI пространства имен и метода children каждый раз, вы можете упростить использование метода getNamespaces, чтобы сопоставить все пространства имен одному массиву, а затем сопоставить дочерние элементы с этим пространством имен к одному объекту. с помощью метода children, например:

$namespaces = $ytFeed->getNameSpaces(true);
$yt = $ytFeed->children($namespaces['yt']);
$yt->statistics['viewCount'];

// Access all media: namespaced group elements like in your "working" example:
$media = $ytFeed->children($namespaces['media']);
$media->group->category;

Я понимаю, что это более 2 лет, и ответ был принят, но принятый ответ на самом деле является просто альтернативой, которая лучше документирована и более интуитивна, но не говорит другим, кто находит этот вопрос, реальным способом достижения этого с SimpleXML, который, в конце концов, требует только двух дополнительных строк кода для 6-8 дополнительных строк DOMDocument и другого расширения, которое может ввести будущих читателей в заблуждение, заставляя их думать, что это невозможно сделать с помощью SimpleXML. Может, и это легко, но не очень очевидно.

5 голосов
/ 28 июля 2011

Простая передача аргумента пространства имен при вызове дочерней функции

$nodes = $xml->children('gd', true);

См. Руководство: http://www.php.net/manual/en/simplexmlelement.children.php

2 голосов
/ 28 июля 2011

Использование DomDocument и DomXpath :

error_reporting(E_ALL ^ E_STRICT);
ini_set('display_errors', 'on');

$dom = new DomDocument;
$dom->load('data.xml');

$xpath = new DomXpath($dom);
$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');
$xpath->registerNamespace('media', 'http://search.yahoo.com/mrss/');
$xpath->registerNamespace('gd', 'http://schemas.google.com/g/2005');
$xpath->registerNamespace('yt', 'http://gdata.youtube.com/schemas/2007');

$favoriteCountAttr = $xpath->query('/atom:entry/yt:statistics/@favoriteCount')->item(0);
if ($favoriteCountAttr instanceof DomAttr) {
    echo $favoriteCountAttr->nodeValue; // output: 10
}
...