You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XML转JSON时空元素被转为空数组的问题求助

解决XML空元素转JSON后变为空数组的问题

当你用SimpleXML加载包含空元素的XML,再通过json_encode转成JSON、json_decode解析为关联数组时,空元素(比如示例里的<ean></ean>)会被转换成空数组,调整depth参数无法解决这个问题——因为depth控制的是递归解析的深度,和空值的序列化逻辑无关。

方案一:直接处理SimpleXML对象(推荐)

不用走JSON中转,递归遍历SimpleXML对象,将空元素转为空字符串:

function processXmlEmptyElements($xmlObj) {
    $result = [];
    foreach ($xmlObj as $key => $element) {
        $elementValue = trim((string)$element);
        // 元素为空则设为空字符串,有子元素则递归处理
        if ($elementValue === '') {
            $result[$key] = '';
        } elseif (count($element->children()) > 0) {
            $result[$key] = processXmlEmptyElements($element);
        } else {
            $result[$key] = $elementValue;
        }
    }
    return $result;
}

使用方式:

$xml = simplexml_load_file($url);
$products = processXmlEmptyElements($xml);

方案二:用DOMDocument精准解析

如果需要更精细的控制,用DOMDocument结合XPath解析,直接获取元素值,空元素自然得到空字符串:

$dom = new DOMDocument();
$dom->load($url);
$xpath = new DOMXPath($dom);

$products = [];
// 遍历所有item节点
foreach ($xpath->query('//item') as $itemNode) {
    $product = [];
    // 获取productname的值
    $nameNode = $xpath->query('./productname', $itemNode)->item(0);
    $product['productname'] = $nameNode ? trim($nameNode->nodeValue) : '';
    // 获取ean的值
    $eanNode = $xpath->query('./ean', $itemNode)->item(0);
    $product['ean'] = $eanNode ? trim($eanNode->nodeValue) : '';
    
    $products[] = $product;
}

为什么原方法会出现空数组?

SimpleXML的空元素在json_encode时会被序列化为JSON空对象{},而json_decode第二个参数设为TRUE时,会把JSON空对象转换成PHP空数组[],这是JSON解码的默认行为,和depth参数无关。

内容的提问来源于stack exchange,提问作者Mickey Rasmussen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:06:43