PHP解析SOAP响应时如何提取内嵌JSON的Respuesta字段值
问题根因
你现有代码已经成功提取到SOAP响应中<AutenticacionResult>节点存储的JSON格式字符串,但未对这段字符串做二次JSON解码,因此无法直接读取内部的Respuesta字段值。
修正方案
在现有代码逻辑基础上,对提取到的JSON字符串增加一次解码操作即可拿到目标token,修正后的完整代码如下:
$response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response); $xml = new SimpleXMLElement($response); $body = $xml->xpath('//soapBody')[0]; $array = json_decode(json_encode((array)$body), TRUE); // 对内嵌的JSON字符串做二次解码,转为关联数组 $authInfo = json_decode($array['AutenticacionResponse']['AutenticacionResult'], true); // 直接读取目标字段 $token = $authInfo['Respuesta']; echo $token;
更简洁的实现方式
不需要把XML对象反复转码成数组,直接通过XPath定位目标节点读取内容即可,代码更简洁性能更好:
// 处理XML命名空间前缀 $response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response); $xml = new SimpleXMLElement($response); // 直接定位到存储认证结果的节点 $resultNode = $xml->xpath('//AutenticacionResult')[0]; // 解码节点内的JSON内容 $authInfo = json_decode((string)$resultNode, true); $token = $authInfo['Respuesta'];
注意事项
- 调用
json_decode时传入第二个参数true,会将解码结果返回为关联数组,方便直接通过键名取值 - 读取SimpleXMLElement节点的文本内容时,建议强制转换为
string类型,避免返回XML对象导致JSON解码失败
内容的提问来源于stack exchange,提问作者Diasline
相关产品推荐
相关产品推荐

