2009-10-01 3 views
4

функцию в моем приложении делает следующее:PHP, json_encode, json_decode из SimpleXML объекта

  • Захват веб-страницы с помощью Снупи
  • результат нагрузки в DOMDocument
  • Load 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 
) 

ответ

2

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

Мне это тоже нравится. я мог бы просто сделать это :) спасибо. – 2009-10-01 17:52:14

+0

Это на самом деле единственное решение, так как json_encode теряет кучу данных. – 2009-10-02 12:19:31

0

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

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

это по-прежнему не работает, вероятно, из-за того, что стефановских сказал о @ будучи зарезервированный символ. – 2009-10-01 17:18:03

+1

Это потому, что только * внешний * stdClass преобразуется в массив, все значения массива все равно будут объектами stdClass. Однако, если вы использовали decode_json ($ json_string, TRUE) *, обратите внимание на истинное логическое значение *. Затем вы можете получить доступ к $ array ['@ attribute']. - '@' - это строка в этой точке, а не * зарезервировано *. – null

3

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

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

+0

{@stefan} - вы легенда;). хорошо, что мой новый факт дня, @ является зарезервированным символом. – 2009-10-01 17:17:06

+0

обновление: json_encoding simplexml, похоже, уносит тонну информации. поэтому я меняю принятый ответ на сохранение необработанного xml в db. – 2009-10-02 12:18:36

Смежные вопросы