Доступ к содержимому дочерних узлов из SimpleXML

У меня проблемы с доступом к дочерним узлам моего содержимого SimpleXML. Я пробовал несколько вариантов, таких как $xmlData->id или $xmlData['id'].

Я несколько новичок в этой области, поэтому любая помощь будет принята с благодарностью.

Пример кода:

    $xmlData = simplexml_load_string($string);
    $person = $xmlData->documentElement;
    $id = $xmlData->id;

Дамп Var $xmlData из Simple XML:

object(SimpleXMLElement)#23 (10) { 
     ["id"]=> string(10) "yTZn1JIaaa" 
     ["first-name"]=> string(6) "First Name" 
     ["last-name"]=> string(6) "Last Name"...

person jsuissa    schedule 30.01.2012    source источник
comment
Что такое сообщение об ошибке? И о каких дочерних узлах вы спрашиваете?   -  person hakre    schedule 30.01.2012
comment
Хм, кажется, ->id должно работать... Какой у вас входной XML?   -  person Wrikken    schedule 30.01.2012
comment
возможный дубликат отображения данных из XML с использованием php simplexml   -  person Gordon    schedule 31.01.2012
comment
возможный дубликат узла SimpleXML Reading с именем через дефис   -  person Gordon    schedule 31.01.2012


Ответы (1)


Я попытался восстановить ваш фрагмент:

<?php
$string = "<person><id>1</id><firstname>Foo</firstname><lastname>Bar</lastname></person>";
$xmlData = simplexml_load_string($string);
echo $xmlData->id . " - " . $xmlData->firstname . " - " . $xmlData->lastname;
?>

Это сработало для меня нормально - вывод был:

1 - Foo - Bar

Вы можете видеть, что мои тэги имени и фамилии отличаются от ваших - тире иногда вызывает проблемы. Если вам нужен тире, сделайте это вместо этого:

echo $xmlData->id . " - " . $xmlData->{'first-name'} . " - " . $xmlData->{'last-name'};

В любом случае, id работало нормально... так что, может быть, у вас есть другая ошибка, которая мешает правильному запуску ваших скриптов? Возможно, было бы полезно, если бы вы могли опубликовать свою XML-строку.

Привет, Макс

P.S.: Почему вы выполняете эту строку?

$person = $xmlData->documentElement;
person Max    schedule 30.01.2012
comment
Большое спасибо! Да, с приборкой были проблемы. {'a'} имеет смысл метода. Теперь все работает. Первоначально у меня не было строки $person = в коде, но, просмотрев еще несколько примеров, я попробовал ее. Конечно, не помогло. - person jsuissa; 30.01.2012
comment
@jsuissa технически этот ответ совпадает с кодом, который, как вы утверждаете, не работает. не могли бы вы указать, в чем именно заключалась проблема, из-за которой он теперь внезапно заработал? - person Gordon; 30.01.2012
comment
Конечно, кажется, что без квадратных скобок просто $xmlData-›first-name не удалось, но с таким {'first-name'} это сработало. Я сам не уверен, почему. Хотите знать, может ли это быть связано с использованием Codeigniter? - person jsuissa; 31.01.2012
comment
@jsuissa нет, это потому, что PHP будет интерпретировать $xmlData-›first-name как $xmlData-›first-name, например он попытается вычесть. Дефисы не являются допустимыми именами переменных, и если вы встретите их в XML, вы должны использовать синтаксис фигурных скобок. В вашем вопросе действительно запрашивался элемент id, а не элементы с дефисом. Пожалуйста, постарайтесь быть более конкретным в следующий раз. - person Gordon; 31.01.2012