Это результат работы print_r()
на обычном объекте SimpleXMLElement:
SimpleXMLElement Object ( [@attributes] => Array ( ) )
Что означает этот знак?
Это объект SimpleXMLElement . Строка «@attributes» является внутренним представлением атрибутов из элемента XML. Используйте функции SimpleXML для получения данных с этого объекта, а не для непосредственного взаимодействия с ним.
Все эти ответы об ошибках неверны. @ Ничего не значит. Вот как свойство называется внутренне, но не полагайтесь на это . Не полагайтесь на print_r()
или var_dump()
при работе с SimpleXML. SimpleXML выполняет множество «магических» вещей, которые неправильно представлены print_r()
и var_dump()
.
Если вам нужно знать, что внутри «фрагмента XML», просто используйте ->asXML()
.
Извините, не могу комментировать как гость, но для тех, кто заканчивается здесь, как я … Я создаю свои собственные поля формы Joomla, и Joomla создает очень «интересный» объект из всех видов вещей. Теперь, я не хотел становиться экспертом SimpleXML, все, что я хотел, было оригинальным текстом ярлыка, который был пропущен в @attributes.
После немного "hmmm, I wonder if this works?"™
Я нашел, что это самый простой способ доступа к этим значениям:
var_dump($simpleXMLObject); /* Result */ object(SimpleXMLElement) public '@attributes' => array (size=3) 'name' => string 'awesome' 'label' => string 'Awesome Label' 'type' => string 'typeOfAwesome' echo $simpleXMLObject->attributes()->label; // Awesome Label $simpleXMLObject->attributes()->label = 'Different Day, Different Awesome'; echo $simpleXMLObject->attributes()->label; // Different Day, Different Awesome
Они не лгали. Это действительно просто.
У меня недостаточно ответов, чтобы прокомментировать user3098738 … но хотелось проверить его ответ. Это действительно настолько просто. Каждый раз, когда вы запускаете @ атрибуты в SimpleXML … используйте
$simpleXMLObject->attributes() $simpleXMLObject->key->attributes()
Я работаю с API HTTP, который выдает только данные в формате XML. Поэтому сначала я загрузил его в SimpleXML и был также озадачен проблемой @attributes .. как я могу получить ценные данные, которые он содержит? print_r () меня смутило.
Мое решение состояло в том, чтобы создать массив и переменную итератора в 0. Прокрутите объект SimpleXML с помощью foreach и получите данные с помощью метода attributes () и загрузите его в мой созданный массив. Итерация перед концом цикла foreach.
Итак, print_r () проигнорировал это:
SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 1 [First] => John [Last] => Smith ) )
Для более удобного нормального массива. Это здорово, потому что мне нужен вариант быстрого преобразования массива в json, если это необходимо.
Мое решение в коде:
$obj = simplexml_load_string($apiXmlData); $fugly = $obj->Deeply->Nested->XML->Data->Names; $people = array(); $i = 0; foreach($fugly as $val) { $people[$i]['id'] += $val->attributes()->ID; $people[$i]['first'] = "". $val->attributes()->First; $people[$i]['last'] = "". $val->attributes()->Last; $i++; }
Во-$obj = simplexml_load_string($apiXmlData); $fugly = $obj->Deeply->Nested->XML->Data->Names; $people = array(); $i = 0; foreach($fugly as $val) { $people[$i]['id'] += $val->attributes()->ID; $people[$i]['first'] = "". $val->attributes()->First; $people[$i]['last'] = "". $val->attributes()->Last; $i++; }
Быстрое примечание: функция settype () PHP является странной / багги, поэтому я добавил +, чтобы убедиться, что идентификатор является целым числом и добавил кавычки, чтобы убедиться, что имя является строкой . Если нет какого-либо преобразования переменных, вы собираетесь загружать объекты SimpleXML в созданный массив.
Конечный результат print_r ():
Array ( [0] => Array ( [id] => 1 [first] => John [last] => Smith ) [1] => Array ( [id] => 2 [first] => Jane [last] => Doe ) )