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