Доступ к @attribute из SimpleXML - PullRequest
       26

Доступ к @attribute из SimpleXML

104 голосов
/ 30 октября 2009

У меня проблема с доступом к разделу @attribute моего объекта SimpleXML. Когда я var_dump весь объект, я получаю правильный вывод, а когда я var_dump остальной объект (вложенные теги), я получаю правильный вывод, но когда я следую документам и var_dump $xml->OFFICE->{'@attributes'}, Я получаю пустой объект, несмотря на то, что первый var_dump ясно показывает, что есть атрибуты для вывода.

Кто-нибудь знает, что я здесь делаю неправильно / как я могу заставить эту работу работать?

Ответы [ 8 ]

122 голосов
/ 26 сентября 2012

Попробуйте это

$xml->attributes()->Token
82 голосов
/ 30 октября 2009

Вы можете получить атрибуты элемента XML, вызвав функцию attribute () на узле XML. Затем вы можете var_dump вернуть значение функции.

Больше информации на php.net http://php.net/simplexmlelement.attributes

Пример кода с этой страницы:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}
47 голосов
/ 04 сентября 2013

Раньше я много раз получал @attributes, как показано ниже, и это было немного длиннее.

$att = $xml->attributes();
echo $att['field'];

Это должно быть проще, и вы можете получить атрибуты следующего формата только сразу:

Стандартный способ - атрибуты доступа к массиву (AAA)

$xml['field'];

Другие альтернативы:

Право и быстрое форматирование

$xml->attributes()->{'field'};

Неправильные форматы

$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];
37 голосов
/ 05 августа 2010
$xml = <<<XML
<root>
<elem attrib="value" />
</root>
XML;

$sxml = simplexml_load_string($xml);
$attrs = $sxml->elem->attributes();
echo $attrs["attrib"]; //or just $sxml->elem["attrib"]

Использование SimpleXMLElement::attributes.

По правде говоря, обработчик SimpleXMLElement get_properties лежит долго. Нет свойства с именем "@attributes", поэтому вы не можете сделать $sxml->elem->{"@attributes"}["attrib"].

14 голосов
/ 05 августа 2010

Вы можете просто сделать:

echo $xml['token'];
7 голосов
/ 08 августа 2010

Если вы ищете список этих атрибутов, XPath станет вашим другом

print_r($xml->xpath('@token'));
2 голосов
/ 08 января 2015

К сожалению, у меня есть уникальная сборка (на данный момент привязанная к Gentoo) PHP 5.5, и я обнаружил, что

 $xml->tagName['attribute']

было единственным решением, которое сработало. Я перепробовал все описанные выше методы Боры, в том числе формат «Right & Quick», и все они провалились.

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

Наслаждайтесь тем, чего это стоит (я упоминал уникальную сборку?).

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

Это помогло мне преобразовать результат simplexml_load_file ($ file) в структуру JSON и декодировать его обратно:

$xml = simplexml_load_file("$token.xml");
$json = json_encode($xml);
$xml_fixed = json_decode($json);

$try1 = $xml->structure->{"@attributes"}['value'];
print_r($try1);

>> result: SimpleXMLElement Object
(
)

$try2 = $xml_fixed->structure->{"@attributes"}['value'];
print_r($try2);

>> result: stdClass Object
(
    [key] => value
)
...