Доступ до @attribute з SimpleXML


120

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

Хтось знає, що я тут роблю неправильно / як я можу зробити цю роботу?


5
var_dump () вводить в оману, коли мова йде про SimpleXML. Не сприймайте його результати буквально. Також, ви не можете отримати доступ до атрибутів, використовуючи доступ до масиву? наприклад, $ xml-> OFFICE ['MyAttribute']?
Френк Фермер

якщо ви хочете використовувати ['@attributes'], вам потрібно передати SimpleXMLElement спочатку до масиву
Enrique

Відповіді:


88

Ви можете отримати атрибути елемента XML, викликавши функцію attributes () на вузлі 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";
}

7
Цікаво, що $bбуде таким SimpleXMLElementпредметом print_rі var_dumpподарує вам дивні речі. Ви можете віддати це як рядок (або як завгодно), щоб обійти це.
jxmallett

Зробіть "". $ B, щоб зберегти це як рядок
dr_rk

135

Спробуйте це

$xml->attributes()->Token

2
На це вже відповів @Artefacto .
хакре

45
Так, але в більш
важкій

2
Так, це найелегантніше рішення.
Крістіан

Я спробував це, і я думаю, що сторінка виходить з ладу. Бора, здається, вважає, що це неправильний формат, з яким я згоден у цей момент. Однак я бачив цей (ваш) формат багато разів. Чи є якийсь нюанс, який мені не вистачає?
Джерард ONeill

2
@GerardONeill, я не розумію, чому Бора каже, що це неправильний спосіб доступу до атрибутів, він працює досить ідеально. Те, що вам може не вистачати, - це те, що вам потрібно зателефонувати attributes()на об'єкт, що відповідає правильному тегу у вашому XML. Як, якщо у вас є, <root><tag attr="a">b</tag></root>тоді вам потрібно зробити $xml->tag->attributes()->attrдоступ до нього.
zysoft

55

Раніше я стільки разів використовував для того, щоб отримати, @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'];

1
Я погоджуюся з вашим першим вашим неправильним форматом, тому що я отримую збої на сторінці - проте багато людей заявляють, що це працює. Будь-яке пояснення чи нюанс з цього приводу?
Джерард ONeill

1
Працюють "неправильні формати". Я завжди використовую перший приклад. Чому це неправильно?
Гжегож

3
З технічної точки зору $xml->attributes()->{'field'}, $xml->attributes()->fieldі $f='field'; $xml->attributes()->$f;те ж саме. Не бачите причин, чому один правильний формат, а інший - неправильний.
zysoft

$ xml-> attributes () -> {'field'} є правильним, оскільки його безпечно використовувати зі спеціальними символами в імені атрибута (тобто "data-attr"). $ xml-> attributes () -> поле працює лише для атрибутів, які є єдиними буквено-цифровими словами
vzr

Отримання SimpleXMLElement при використанні обох правильних параметрів.
Дарій.V

41
$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.

Правда в тому, що get_propertiesобробник SimpleXMLElement лежить великим часом. Немає власності з назвою "@attributes", тому ви не можете цього зробити $sxml->elem->{"@attributes"}["attrib"].


Дякуємо за пояснення, чому SimpleXML поводиться таким химерним чином ( get_propertiesобробник). Дуже цікаво.
andrewtweber

Отримання SimpleXMLElement, коли це
робиться


8

Якщо ви шукаєте список цих атрибутів, то XPath буде вашим другом

print_r($xml->xpath('@token'));

3

Це допомогло мені перетворити результат simplexml_load_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
)

2

На жаль, у мене є унікальна збірка (на даний момент застрягла з Gentoo) PHP 5.5, і я знайшов це

 $xml->tagName['attribute']

було єдиним рішенням, яке спрацювало. Я спробував усі вищевикладені методи Бори, включаючи формат "Правильно і швидко", і всі вони не вдалися.

Те, що це найпростіший формат, є плюсом, але не сподобалося, думаючи, що я божевільно намагаюся, щоб усі формати, які інші говорили, спрацювали.

Насолоджуйтесь, чого вона варта (я згадав унікальну збірку?).


Я зазвичай рекомендую використовувати позначення масиву для атрибутів для атрибутів у тому ж просторі імен елемента, в якому є їх частина. Я б сказав, що це найпростіший формат (у міру його створення). array-доступ із названим атрибутом key = = з елементам simplexml.
хакре
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.