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
相关产品推荐
相关产品推荐

