如何在PHP中正确获取SOAP XML响应中的指定节点值?
问题描述
当前返回结果
SimpleXMLElement Object ( [0] => 1234567 )
审查到的XML结构
<xx> <yy> <a>1</a> <b>2</b> <c>3</c> <d>4</d> </yy> <zz Type="type"> <e>5</e> <f>6</f> <g> <h>7</h> </g> </zz> </xx>
SOAP响应原文(已转义还原)
<s:envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:body> <processrequestresponse xmlns="http://zzz.org/"> <processrequestresult> <xx> <yy> <a>1</a> <b>2</b> <c>3</c> <d>4</d> </yy> <zz Type="type"> <e>5</e> <f>6</f> <g> <h>7</h> </g> </zz> </xx> </processrequestresult> </processrequestresponse> </s:body> </s:envelope>
当前使用的代码
$xml = simplexml_load_string($response); $data = $xml->xpath("//s:Body/*")[0]; $details = $data->children("http://zzz.org/"); $test = $details->ProcessRequestResult[0]; echo '<pre>'; print_r($test);
解决方案
核心注意点
- 大小写敏感:XML元素名区分大小写,你代码里的
ProcessRequestResult要改为小写的processrequestresult,和响应中的元素名保持一致。 - 命名空间处理:注册命名空间后用XPath定位节点更准确,避免查找失败。
- 字符串转换:SimpleXMLElement对象需要强制转为字符串,才能获取节点内的文本值。
完整代码示例
$xml = simplexml_load_string($response); // 注册SOAP和目标命名空间,方便XPath使用 $xml->registerXPathNamespace('s', 'http://schemas.xmlsoap.org/soap/envelope/'); $xml->registerXPathNamespace('ns', 'http://zzz.org/'); // 定位到xx节点 $xxNode = $xml->xpath('//s:Body/ns:processrequestresponse/ns:processrequestresult/xx')[0]; // 逐个获取目标元素的值 $a = (string)$xxNode->yy->a; $b = (string)$xxNode->yy->b; $c = (string)$xxNode->yy->c; $d = (string)$xxNode->yy->d; $e = (string)$xxNode->zz->e; $f = (string)$xxNode->zz->f; // 注意g节点本身无文本,其下h节点值为7,所以取h的内容 $gValue = (string)$xxNode->zz->g->h; // 输出结果 echo "a的值:$a\n"; echo "b的值:$b\n"; echo "c的值:$c\n"; echo "d的值:$d\n"; echo "e的值:$e\n"; echo "f的值:$f\n"; echo "g对应的数值:$gValue\n";
替代方案:直接用XPath定位单个元素
如果不想逐层遍历,也可以直接用XPath定位每个目标元素:
$xml = simplexml_load_string($response); $xml->registerXPathNamespace('s', 'http://schemas.xmlsoap.org/soap/envelope/'); $xml->registerXPathNamespace('ns', 'http://zzz.org/'); $a = (string)$xml->xpath('//s:Body/ns:processrequestresponse/ns:processrequestresult/xx/yy/a')[0]; $b = (string)$xml->xpath('//s:Body/ns:processrequestresponse/ns:processrequestresult/xx/yy/b')[0]; $c = (string)$xml->xpath('//s:Body/ns:processrequestresponse/ns:processrequestresult/xx/yy/c')[0]; $d = (string)$xml->xpath('//s:Body/ns:processrequestresponse/ns:processrequestresult/xx/yy/d')[0]; $e = (string)$xml->xpath('//s:Body/ns:processrequestresponse/ns:processrequestresult/xx/zz/e')[0]; $f = (string)$xml->xpath('//s:Body/ns:processrequestresponse/ns:processrequestresult/xx/zz/f')[0]; $gValue = (string)$xml->xpath('//s:Body/ns:processrequestresponse/ns:processrequestresult/xx/zz/g/h')[0];
内容的提问来源于stack exchange,提问作者magicianiam
相关产品推荐
相关产品推荐

