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



我们使用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 能够本机处理这个问题,但如果没有,有人得到一个不涉及卡顿字符串操作的修复程序吗?

TIA :)

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

SimpleXMLElement属性可以被视为可迭代的,以遍历具有相同名称的同级。它们可以被视为列表或单个值。

这允许您构建自己的数组/对象结构并将其序列化为 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 类。以下是遍历所有子节点或获取当前节点名称的方法。

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

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

然后,它循环遍历这些项目,并在起始节点(在本例中为<apns>节点(下从每个<item>添加新的<apn>节点,值为 ($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);
}

相关内容

最新更新