Как вы уже знаете, SimpleXML позволяет выбрать дочерний узел, используя оператор свойства объекта ->
, или атрибут узла, используя доступ к массиву ['name']
. Это здорово, но операция работает, только если то, что вы выбираете, принадлежит к тому же пространству имен .
Если вы хотите "hop" из пространства имен в другое, вы можете использовать методы children()
или attributes()
. В вашем случае это немного сложнее, потому что у вас есть <item/>
в глобальном пространстве имен, искомый узел находится в пространстве имен «media» *, а затем атрибуты снова находятся в глобальном пространстве имен (они не являются с префиксом.) Таким образом, используя обычную запись объекта / массива, вам придется "hop" дважды:
foreach ($rss->channel->item as $item)
{
// we load the attributes into $thumbAttr
// you can either use the namespace prefix
$thumbAttr = $item->children('media', true)->thumbnail->attributes();
// or preferably the namespace name, read note below for an explanation
$thumbAttr = $item->children('http://search.yahoo.com/mrss/')->thumbnail->attributes();
echo $thumbAttr['url'];
}
* Примечание
Я называю пространство имен "пространством имен" media ", но это не совсем правильно. Имя пространства имен - http://search.yahoo.com/mrss/
, а «media» - это просто префикс, какой-то псевдоним, если хотите. Важно помнить, что http://search.yahoo.com/mrss/
- это настоящее имя пространства имен. В какой-то момент ваш провайдер RSS может решить изменить префикс, скажем, на «Yahoo», и ваш скрипт перестанет работать, если ваш скрипт ссылается на префикс «media». Однако если вы используете имя пространства имен, оно будет работать независимо от префикса.