"При знаке" @ в объекте SimpleXML? - PullRequest
9 голосов
/ 01 декабря 2010

Это вывод print_r(), запускаемый для типичного объекта SimpleXMLElement:

SimpleXMLElement Object
(
    [@attributes] => Array
        (

        )
)

Что означает знак @?

Ответы [ 5 ]

12 голосов
/ 01 декабря 2010

Это SimpleXMLElement объект.Строка '@attributes' является внутренним представлением атрибутов из элемента XML.Используйте функции SimpleXML для получения данных из этого объекта вместо непосредственного взаимодействия с ним.

9 голосов
/ 01 декабря 2010

Все эти ответы о контроле ошибок неверны. @ Не означает ничего . Вот как это свойство вызывается внутри, но не полагайтесь на это . Не полагайтесь на print_r() или var_dump() при работе с SimpleXML. SimpleXML делает много «волшебных» вещей, которые неправильно представлены print_r() и var_dump().

Если вам нужно знать, что находится «внутри» фрагмента XML, просто используйте ->asXML() для него.

1 голос
/ 13 декабря 2013

Извините, я не могу комментировать в качестве гостя, но для всех, кто оказался здесь, как я ... Я создаю свои собственные поля формы Joomla, а Joomla создает очень «интересный» объект всех видов вещей. Теперь я не хотел становиться экспертом по SimpleXML, все, что мне было нужно, это оригинальный текст метки, который был слит в @ атрибутах.

Через некоторое время "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 

Они не лгали. Это действительно просто.

0 голосов
/ 12 февраля 2016

Я работаю с 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++;
}

Быстрая заметка: функция settype () в PHP является странной / ошибочной, поэтому я добавил + , чтобы убедиться, что ID является целым числом , и добавил кавычки чтобы убедиться, что имя строка . Если нет какого-либо преобразования переменных, вы будете загружать объекты SimpleXML в созданный вами массив.

Окончательный результат print_r ():

Array
(
   [0] => Array
    (
        [id] => 1
        [first] => John
        [last] => Smith
    )

   [1] => Array
    (
        [id] => 2
        [first] => Jane
        [last] => Doe
    )
)
0 голосов
/ 21 июня 2014

Мне не хватает представителей, чтобы прокомментировать user3098738 ... но я хотел проверить его ответ. Это действительно настолько просто. Каждый раз, когда вы запускаете @attributes в SimpleXML ... используйте

$simpleXMLObject->attributes()
$simpleXMLObject->key->attributes()
...