PHP, json_encode, json_decode объекта SimpleXML - PullRequest
4 голосов
/ 01 октября 2009

Функция в моем приложении выполняет следующие действия:

  • Захват веб-страницы с помощью Snoopy
  • Загрузить результат в DOMDocument
  • Загрузка DOMDocument в простой XML-объект
  • Запустите XPath, чтобы изолировать необходимый раздел документа
  • json_encode результата и сохранение в базе данных для последующего использования.

Моя проблема возникает при восстановлении этого блока из базы данных и его расшифровке. Я вижу @attributes, когда я var_dump объекта, но не могу найти комбинацию команд, которая позволяет мне получить к ним доступ.

Сообщение об ошибке: Неустранимая ошибка: невозможно использовать объект типа stdClass в качестве массива

Ниже приведен образец моего объекта. Я пробовал, среди прочего, что раньше работало.

echo $obj['class'];

stdClass Object
(
    [@attributes] => stdClass Object
        (
            [class] => race_idx_hdr
        )

    [img] => stdClass Object
        (
            [@attributes] => stdClass Object
                (
                    [src] => /Images/Icons/i_blue_bullet.gif
                    [alt] => image
                    [title] => United Kingdom
                )

        )

    [a] => Fast Cards
)

Ответы [ 3 ]

3 голосов
/ 01 октября 2009

Я на самом деле не совсем понимаю, что вы пытаетесь сделать и где выдается ошибка, но для доступа к свойствам вашего объекта вы можете использовать

echo $obj->{'@attributes'}->class; // prints "race_idx_hdr"
echo $obj->img->{'@attributes'}->src; // prints "/Images/Icons/i_blue_bullet.gif"
echo $obj->img->{'@attributes'}->alt; // prints "image"
echo $obj->img->{'@attributes'}->title; // prints "United Kingdom"
echo $obj->a; // prints "Fast Cards"

Этот странный синтаксис ($obj->{'@attributes'}) необходим, поскольку символ @ зарезервирован в PHP и не может использоваться для идентификаторов.

2 голосов
/ 01 октября 2009

Когда вы декодируете json из базы данных, вы получаете объект типа 'stdClass' вместо исходного типа 'SimpleXMLElement', возвращаемого функцией SimpleXMLElement :: xpath.

Объект stdClass не «знает» о синтаксисе псевдомассива, который используется объектами SimpleXMLElement для доступа к атрибутам.

Обычно вы используете функции serialize () и unserialize () вместо json_encode / decode для хранения объектов в базе данных, но, к сожалению, SimpleXMLElements не работают с ними.

В качестве альтернативы, почему бы просто не сохранить фактический xml и не прочитать его обратно в SimpleXML после извлечения его из базы данных:

// convert SimpleXMLElement back to plain xml string
$xml = $simpleXML->asXML();

// ... code to store $xml in the database
// ... code to retrieve $xml from database

// recreate SimpleXMLELement
$simpleXML = simplexml_load_string($xml);
0 голосов
/ 01 октября 2009

Если объект преобразуется в массив, результатом является массив, элементы которого являются свойствами объекта.

$asArray = (array)$myObj;
echo $asArray['@attribute'];
...