"При знаке" @ в объекте SimpleXML?
Это вывод print_r()
запустить на типичном объекте SimpleXMLElement:
SimpleXMLElement Object
(
[@attributes] => Array
(
)
)
Что означает этот знак?
5 ответов
Это объект 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... но я хотел подтвердить его ответ. Это действительно настолько просто. Каждый раз, когда вы запускаете @attributes в SimpleXML... используйте
$simpleXMLObject->attributes()
$simpleXMLObject->key->attributes()
Я работаю с HTTP API, который выдает только данные в формате XML. Итак, сначала я загрузил его в SimpleXML и также был озадачен проблемой @attributes. Как мне получить ценные данные, которые он содержит? print_r() смутил меня.
Мое решение состояло в том, чтобы создать массив и переменную итератора в 0. Перебрать объект SimpleXML с помощью foreach, получить данные с помощью метода attribues() и загрузить их в мой созданный массив. Выполните итерацию до окончания цикла 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++;
}
Заметим, что функция PHP settype() выглядит странно / ошибочно, поэтому я добавил +, чтобы убедиться, что ID является целым числом, и добавил кавычки, чтобы убедиться, что имя - строка. Если нет преобразования какой-либо переменной, вы будете загружать объекты SimpleXML в созданный вами массив.
Окончательный результат print_r():
Array
(
[0] => Array
(
[id] => 1
[first] => John
[last] => Smith
)
[1] => Array
(
[id] => 2
[first] => Jane
[last] => Doe
)
)