ruskar
@ruskar
Conflict Intelligence Team

SimpleXML, пространства имён и атрибуты тегов?

Пытаюсь спарсить данные о пользователе ЖЖ. Читаю ресурс exampleusername.livejournal.com/data/foaf, загружаю его в SimpleXML:
$input_xml = simplexml_load_string(file_get_contents('http://exampleusername.livejournal.com/data/foaf'));



Поскольку XML там необычный, а с множеством пространств имён, для извлечения полезных данных приходится грузить описания этих пространств имён. Так, например, получаем имя и дату рождения пользователя:
$person = $input_xml->children('http://xmlns.com/foaf/0.1/');
echo $person->Person->name.'<br/>';
echo $person->Person->dateOfBirth;



Теперь я пытаюсь извлечь дату создания блога, делаю следующее:
$blog = $person->Person->weblog->children('http://www.livejournal.org/rss/lj/1.0/');



Теперь если сделать var_dump() переменной $blog, то мы увидим следующее:
object(SimpleXMLElement)#4 (1) {
  ["@attributes"]=>
  array(2) {
    ["dateCreated"]=>
    string(19) "2008-12-15T18:00:10"
    ["dateLastUpdated"]=>
    string(19) "2012-03-16T09:49:22"
  }
}



Однако вызов $blog->attributes() приводит к ошибке «Warning: var_dump(): Node no longer exists in /var/www/test.php on line 45», ассоциативный массив $blog['dateCreated'] тоже не работает. Что я делаю не так?

Пример разбираемого XML-файла
  • Вопрос задан
  • 7769 просмотров
Решения вопроса 1
dali
@dali
получить этот тег в $tag, затем попробовать так:

$attr = $tag->attributes("lj", 1);
$dc = $attr["dateCreated"];
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rPman
Проблема в том что в имени атрибута есть символ '@', решение — преобразовать объект в ассоциативный массив и обратиться к атрибуту как к элементу массива:
$bug_blog=(array)$blog;
var_dump($bug_blog['@attributes']);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы