PHP, json_encode, json_decode объекта SimpleXML

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

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

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

Сообщение об ошибке: Fatal error: нельзя использовать объект типа 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 ) 

Когда вы декодируете 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); 

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

 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 и не может использоваться для идентификаторов.

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

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