Проанализирован 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.

Другие вопросы по тегам