"При знаке" @ в объекте 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
    )
)
Другие вопросы по тегам