首页 > 解决方案 > PHP 使用 SimpleXML 对象从 XML 转换为 JSON。数组与导致问题的标签

问题描述

我们正在使用 SimpleXML 尝试将 XML 转换为 JSON,然后再转换为 PHP 对象,以便我们可以将 Soap API 与我们的 Rest API 进行比较。我们有一个返回大量数据的请求,但有问题的部分是我们有一个嵌套数组。

该数组与 XML 中的标记一起返回,但是我们不希望将其转换为 JSON。

我们得到的 XML 如下:

                  <apns>
                     <item>
                        <apn>apn</apn>
                     </item>
                  </apns>

所以当它被翻译成 JSON 时,它看起来像这样:

{"apns":{"item":{"apn":"apn"}}

实际上,我们希望 SimpleXML 转换为与我们的 Rest API 中相同的 JSON,如下所示:

{"apns":[{"apn":"apn"}]}

数组可能包含不止一件事,例如:

                  <apns>
                     <item>
                        <apn>apn</apn>
                     </item>
                     <item>
                        <apn>apn2</apn>
                     </item>
                  </apns>

我假设这只会在 JSON 中出错或覆盖第一个。

我希望 SimpleXML 能够本机处理这个问题,但如果没有,是否有人得到了不涉及 janky 字符串操作的修复?

蒂亚:)

标签: phparraysjsonxmlsimplexml

解决方案


通用转换不可能知道单个元素应该是 JSON 中的数组。

SimpleXMLElementproperties 可以被视为一个 Iterable 来遍历同名的兄弟。它们可以被视为一个列表或单个值。

这允许您构建自己的数组/对象结构并将其序列化为 JSON。

$xml = <<<'XML'
<apns>
  <item>
    <apn>apn1</apn>
  </item>
  <item>
    <apn>apn2</apn>
  </item>
</apns>
XML;

$apns = new SimpleXMLElement($xml);

$json = [
    'apns' => []
];
foreach ($apns->item as $item) {
    $json['apns'][] = ['apn' => (string)$item->apn]; 
}

echo json_encode($json, JSON_PRETTY_PRINT);

这仍然允许您以一般方式读取/转换零件。更深入地了解 SimpleXMLElement 类。这是遍历所有子节点或获取当前节点名称的方法。


推荐阅读