如何在PHP中从指定SOAP XML响应中获取pinBlocked标签的取值
PHP从SOAP XML响应中获取pinBlocked值的正确方法
失败原因
你直接调用$result->pinBlocked无法获取值有两个核心原因:
- 节点层级不匹配:
pinBlocked不是响应的顶层节点,它嵌套在soap:Body > ReadCardStatusResponse > status层级下 - 命名空间未处理:响应中
ReadCardStatusResponse及子节点都归属http://theapi.com自定义命名空间,普通对象属性访问无法直接识别命名空间下的节点
实现方案
场景1:$result是SoapClient扩展返回的响应对象
如果你是通过PHP内置SoapClient调用接口得到的$result,直接按层级访问即可:
$pinBlocked = $result->ReadCardStatusResponse->status->pinBlocked; // 如需转布尔类型可加如下处理 $pinBlocked = filter_var($pinBlocked, FILTER_VALIDATE_BOOLEAN);
场景2:$result是原始XML字符串
如果你拿到的是未解析的XML原始字符串,用SimpleXML处理即可,两种写法可选:
写法1:XPath定位(更简洁)
// 加载XML字符串 $xml = simplexml_load_string($result); // 注册自定义命名空间 $xml->registerXPathNamespace('ns', 'http://theapi.com'); // 定位pinBlocked节点 $pinBlocked = (string)$xml->xpath('//ns:pinBlocked')[0]; // 转布尔类型 $pinBlocked = filter_var($pinBlocked, FILTER_VALIDATE_BOOLEAN);
写法2:按层级逐级访问
$xml = simplexml_load_string($result); // 取SOAP协议Body节点 $soapBody = $xml->children('http://www.w3.org/2003/05/soap-envelope')->Body; // 取自定义命名空间下的业务节点 $bizData = $soapBody->children('http://theapi.com')->ReadCardStatusResponse; $pinBlocked = (string)$bizData->status->pinBlocked; // 转布尔类型 $pinBlocked = filter_var($pinBlocked, FILTER_VALIDATE_BOOLEAN);
内容的提问来源于stack exchange,提问作者M Suhayl
相关产品推荐
相关产品推荐

