Проанализирован SimpleXMLElement отсутствует атрибуты
У меня есть этот маленький кусок XML, который я хочу проанализировать в PHP. Works
тег в порядке, я могу разобрать все атрибуты просто отлично. У меня проблема с Doesnt
Похоже, что из-за текстового содержимого я не могу получить доступ к атрибутам.
<Export id="123" apples="pears">
<Works foo="bar" id="234"/>
<Doesnt bar="foo" id="345">Stack Exchange</Doesnt>
</Export>
Я запускаю следующий (очень простой) код:
$plain = '<Export id="123" apples="pear....esnt></Export>'; // as above
$sxe = simplexml_load_string($plain);
$json = json_encode($sxe);
$native = json_decode($json);
print_r($sxe, true);
print_r($native, true);
И я получаю следующий вывод:
SimpleXMLElement Object
(
[@attributes] => Array
(
[id] => 123
[apples] => pears
)
[Works] => SimpleXMLElement Object
(
[@attributes] => Array
(
[foo] => bar
[id] => 234
)
)
[Doesnt] => Stack Exchange
)
stdClass Object
(
[@attributes] => stdClass Object
(
[id] => 123
[apples] => pears
)
[Works] => stdClass Object
(
[@attributes] => stdClass Object
(
[foo] => bar
[id] => 234
)
)
[Doesnt] => Stack Exchange
)
Как видите, SimpleXMLElement
объект и stdClass
оба объекта отсутствуют все атрибуты для <Doesnt>
тег. Есть ли какие-то обходные пути или альтернативные способы их достижения?
1 ответ
Как сказал @Gordon, вы не получите всю картину с print_r
а также var_dump
: SimpleXMLElement Object
имеет некоторые необычные свойства, поэтому эти функции дампа не смогут правильно представить свою структуру.
Тем не менее, если бы вы использовали это вместо:
$sxe = simplexml_load_string($plain);
var_dump($sxe->Doesnt);
... вы бы видели эти атрибуты и их значения нетронутыми.
Но посмотрите внимательно на результат:
object(SimpleXMLElement)[3]
public '@attributes' =>
array (size=2)
'bar' => string 'foo' (length=3)
'id' => string '345' (length=3)
string 'Stack Exchange' (length=14)
Это немного необычно, не правда ли, иметь string
стоимость просто висит там - без какого-либо соответствующего имущества, владеющего ею? Но это именно то, что делает прямое преобразование проблематичным. JSON (как он есть) имеет дело с простыми структурами - объектами и массивами - и эта структура не может быть правильно представлена ни в одной из них: вам нужно хотя бы ввести какой-то дополнительный атрибут для хранения текстового содержимого.
Тем не менее, этот подход кажется востребованным (в некоторой степени), и вы определенно не одиноки: вот открытый билет в системе отслеживания ошибок PHP.