在我的应用程序的函数执行以下操作:
- 使用史努比捕捉网页
- 加载结果到DOM文档
- DOM文档加载到简单的XML对象
- 运行的XPath需要的文档部分隔离
- json_encode结果并保存到数据库中供以后使用。
恢复从数据库中该块时,和解码是我的问题就出现了。 我可以看到@属性,当我的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
)
当你解码从数据库中JSON,你会得到类型的对象“stdClass的”,而不是原始类型“的SimpleXMLElement”通过为SimpleXMLElement返回:: XPath函数。
所述stdClass的对象不“知道”关于使用的SimpleXMLElement对象,以允许访问的属性的伪阵列的语法。
通常你会使用序列化()和反序列化()函数而不是json_encode /解码存储在数据库中的对象,但不幸的是,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'}
因为需要@
-symbol在PHP保留,不能用于标识符。
如果一个对象被转换成一个阵列,其结果是一个数组,其元素为对象的属性。
$asArray = (array)$myObj;
echo $asArray['@attribute'];