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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:07:18