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

SOAP API初学者求助:如何循环解析XML响应中的Village与VillageName标签

解决方案:循环遍历SOAP XML响应中的Village和VillageName标签

看起来你已经成功调用了SOAP API并拿到了XML响应,只是还没找到正确的方式循环遍历所有目标标签。下面提供两种基于PHP的可行方案,你可以根据自己的习惯选择:

方法一:基于DOMDocument的循环遍历(扩展你现有代码)

你当前已经能通过getElementsByTagName单个获取节点值,只需要对返回的DOMNodeList进行循环即可。更严谨的方式是先定位到每个VILLAGES父节点,再从中提取对应的子标签值,避免节点顺序变化导致的错误:

$doc = new DOMDocument();
$doc->loadXML($data);

// 获取所有VILLAGES节点列表
$villagesList = $doc->getElementsByTagName('VILLAGES');

// 循环遍历每个VILLAGES节点
foreach ($villagesList as $villageItem) {
    // 获取当前节点下的Village标签值,处理节点不存在的情况
    $villageCode = $villageItem->getElementsByTagName('Village')->item(0) 
        ? trim($villageItem->getElementsByTagName('Village')->item(0)->nodeValue) 
        : '无编码';
    
    // 获取当前节点下的VillageName标签值
    $villageName = $villageItem->getElementsByTagName('VillageName')->item(0)
        ? trim($villageItem->getElementsByTagName('VillageName')->item(0)->nodeValue)
        : '无名称';
    
    // 输出或处理获取到的值
    echo "村庄编码:{$villageCode},村庄名称:{$villageName}<br>";
}

说明:

  • getElementsByTagName('VILLAGES')返回的是可迭代的DOMNodeList对象,直接用foreach就能遍历所有村庄节点
  • 用trim()去除标签值前后的空格(看你的XML里名称有 trailing space,比如Adcol )
  • 添加了节点不存在的容错处理,避免出现Call to a member function nodeValue() on null错误

方法二:使用SimpleXML(更简洁的语法)

如果你偏爱更简洁的代码,SimpleXML是不错的选择,它能让你像访问对象属性一样操作XML节点:

// 加载XML响应
$xml = simplexml_load_string($data);

// 定位到实际数据所在的节点(注意处理SOAP和diffgr命名空间)
$soapBody = $xml->children('http://schemas.xmlsoap.org/soap/envelope/')->Body;
$result = $soapBody->children()->GetAllVillResponse->GetAllVillResult;
$diffgram = $result->children('diffgr', true)->diffgram;
$villagesData = $diffgram->dsVillages;

// 循环遍历每个村庄
foreach ($villagesData->VILLAGES as $village) {
    $villageCode = trim((string)$village->Village);
    $villageName = trim((string)$village->VillageName);
    
    echo "村庄编码:{$villageCode},村庄名称:{$villageName}<br>";
}

说明:

  • 由于SOAP响应包含命名空间,需要用children()方法指定命名空间来定位节点
  • 把SimpleXML对象转换为字符串((string))才能获取节点的文本值
  • 同样用trim()清理了多余的空格

两种方法都能实现你的需求,你可以根据自己对XML操作的熟悉程度选择。如果XML结构后续有复杂变化,DOMDocument会更灵活;如果只是简单的遍历提取,SimpleXML的代码可读性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:42:45