【问题标题】:PHP - Overloaded object of type SimpleXMLElement is not compatible with ArrayObjectPHP - SimpleXMLElement 类型的重载对象与 ArrayObject 不兼容
【发布时间】:2015-08-20 08:54:15
【问题描述】:

我希望能够使用 SimpleXMLElement Object 作为关联数组。
我正在尝试使用 ArrayObject 类对其进行转换。

SimpleXMLElement 对象有什么特别之处以至于它与ArrayObject不兼容

注意:我可以用其他方式转换它,但我很好奇为什么这种方法不起作用。

$dom = new DOMDocument();
$dom->loadHTML($html);
...
var_dump(new ArrayObject(simplexml_import_dom($dom)));

给我:未捕获的异常“InvalidArgumentException”和消息“SimpleXMLElement 类型的重载对象与 ArrayObject 不兼容”

【问题讨论】:

  • 我不清楚你想要达到什么目的。 SimpleXML已经表现得像一个数组,字符串键代表当前节点的属性。您认为ArrayObjectSimpleXMLElement 本身更适合使用的实际问题是什么?

标签: php simplexml


【解决方案1】:

我觉得你写错了

$dom = new DOMDocument();
$dom->loadHTML("<html><body>Hello</body></html>");

$myArray = (Array)simplexml_import_dom($dom);

echo $myArray["body"]; //prints "hello"

说明
ArrayObject 假设获取一个对象并将其转换为数组。

使 SimpleXMLElement 难以使用的原因在于它的感觉和行为就像一个对象,但实际上是一个系统资源(特别是 libxml 资源)。

编辑
将整个xml转换成数组:

$dom = new DOMDocument();
$dom->loadHTML("<html><body><div><span>Hello</span></div></body></html>");

$myArray = json_decode(json_encode(simplexml_import_dom($dom)),true);

print_r($myArray);

结果:

Array
(
    [body] => Array
        (
            [div] => Array
                (
                    [span] => Hello
                )

        )

)

【讨论】:

  • 您提供的代码的问题是转换仅影响对象的第一个维度。如果您有一个包含其他对象的多维对象 - 它们不会被强制转换。
  • 你是对的。抱歉,我添加了一个编辑。 @Boarking
  • 请注意,json_decode(json_encode()) 技巧是一种有损转换 - 它会丢弃任何不能整齐地编码在普通数组中但在原始 SimpleXMLElement 对象。你通常最好决定你想要什么信息并使用basic SimpleXML operations“手动”创建数组。
猜你喜欢
  • 2018-04-21
  • 1970-01-01
  • 2021-10-10
  • 2019-02-08
  • 1970-01-01
  • 2015-10-23
  • 2018-01-24
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多