PHP 使用 SimpleXML 对象从 XML 转换为 JSON。带有 <items> 标签的数组导致问题

扭蛋机1000

我们正在使用 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 字符串操作的修复?

TIA :)

Nigel Ren

我希望这段代码可以作为您所追求的模板有用,问题是很难知道这是否是您尝试做的唯一实例......

这样做是首先item/apn使用 XPath查找下面具有结构的//*[item/apn]任何节点表示//*下面具有以下节点的任何节点)。

然后它循环遍历这些项目并<apn>在起始节点(<apns>在本例中节点)下方添加新节点,每个节点<item>的值都为 ( $list->addChild("apn", (string)$item->apn);.

复制节点后,它将删除所有<item>节点 ( unset($list->item);)。

$input = '<apns>
                     <item>
                        <apn>apn</apn>
                     </item>
                     <item>
                        <apn>apn2</apn>
                     </item>
                  </apns>';

$xml = simplexml_load_string($input);
$itemList = $xml->xpath("//*[item/apn]");

foreach ( $itemList as $list ) {
    foreach ( $list->item as $item )  {
        $list->addChild("apn", (string)$item->apn);
    }
    unset($list->item);
}

echo $xml->asXML();

给...

<?xml version="1.0"?>
<apns>


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

echo json_encode($xml);

给...

{"apn":["apn","apn2"]}

如果您只想要最后一个值,那么您可以跟踪最后一个值并将新元素设置在内循环之外......

$itemList = $xml->xpath("//*[item/apn]");

foreach ( $itemList as $list ) {
    foreach ( $list->item as $item )  {
        $apn = (string)$item->apn;
    }
    $list->addChild("apn", $apn);
    unset($list->item);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章