PHP不使用SimpleXML解析含多节点XML并转为数组
用DOMDocument处理包含多item节点的XML解析
没问题,既然你想继续沿用DOMDocument的处理方式,我来帮你修改代码,把那些重复的item节点整理成可遍历的数组。
修改后的完整代码
// 接收XML并去除首尾空格 $xml_post = trim(file_get_contents('php://input')); // 将POST的XML保存到文件以验证数据 file_put_contents($_SERVER['DOCUMENT_ROOT'].'/../something/something.txt', print_r($xml_post, true)); // 初始化DOMDocument $xml = new DOMDocument(); // 加载XML $xml->loadXML($xml_post); // 将XML解析为可用数组 $xmlval = array(); // 处理单一值节点(和之前逻辑一致) $xmlval['orderid'] = $xml->getElementsByTagName("orderid")->item(0)->nodeValue; $xmlval['test'] = $xml->getElementsByTagName("test")->item(0)->nodeValue; $xmlval['referrer'] = $xml->getElementsByTagName("referrer")->item(0)->nodeValue; // 处理多item节点,整理为数组 $xmlval['items'] = array(); // 获取所有item节点 $itemNodes = $xml->getElementsByTagName("item"); // 遍历每个item节点 foreach ($itemNodes as $node) { $item = array(); // 提取当前item下的各个字段 $item['productname'] = $node->getElementsByTagName("productname")->item(0)->nodeValue; $item['quantity'] = $node->getElementsByTagName("quantity")->item(0)->nodeValue; $item['returnprice'] = $node->getElementsByTagName("returnprice")->item(0)->nodeValue; $item['originalprice'] = $node->getElementsByTagName("originalprice")->item(0)->nodeValue; // 将当前item加入items数组 $xmlval['items'][] = $item; } // 之后就可以这样遍历了: // foreach($xmlval['items'] as $item) { // echo $item['productname'] . ' - ' . $item['quantity']; // }
关键逻辑说明
- 先用
getElementsByTagName("item")获取所有的item节点集合,这个集合是DOMNodeList类型,可以直接用foreach遍历。 - 对每个item节点,我们在当前节点内部调用
getElementsByTagName来获取它的子节点,这样就不会和其他item的子节点混淆。 - 把每个item的字段整理成数组后,追加到
$xmlval['items']里,之后就可以用你想要的foreach循环遍历这个数组了。
你提供的XML示例参考
<return > <orderid>ggfegse53534353</orderid> <test>true</test> <referrer>gfdgsdggfgrer</referrer> <items> <item> <productname>something</productname> <quantity>1</quantity> <returnprice>$19.95</returnprice> <originalprice>$19.95</originalprice> </item> <item> <productname>something2</productname> <quantity>5</quantity> <returnprice>$19.95</returnprice> <originalprice>$19.95</originalprice> </item> <item> <productname>something3</productname> <quantity>8</quantity> <returnprice>$19.95</returnprice> <originalprice>$19.95</originalprice> </item> </items> </return>
内容的提问来源于stack exchange,提问作者user756659
相关产品推荐
相关产品推荐

