Доступ к узлам узлов пространства имен в XML с помощью SimpleXML PHP

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

Я пытаюсь получить доступ к рейтингу и 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://img.ruphp.com/parsing/0.jpg' height='240' width='320' time='00:05:00' /> <media:thumbnail url='http://img.ruphp.com/parsing/1.jpg' height='90' width='120' time='00:02:30' /> <media:thumbnail url='http://img.ruphp.com/parsing/2.jpg' height='90' width='120' time='00:05:00' /> <media:thumbnail url='http://img.ruphp.com/parsing/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> 

Solutions Collecting From Web of "Доступ к узлам узлов пространства имен в XML с помощью SimpleXML PHP"

Использование 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 } 

Хорошо, первая проблема заключается в том, что вы неправильно используете метод 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; 

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

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

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

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