如何用PHP CURL解析SOAP XML响应并提取指定节点内容
PHP解析SOAP XML响应提取指定节点内容
问题说明
通过PHP CURL发送SOAP请求后得到XML响应,需要提取<a:Content>This my content</a:Content>节点的内容,但直接使用simplexml_load_string或new SimpleXMLElement无法访问该节点,核心原因是XML包含命名空间,必须先注册命名空间才能正确查询。
可行解析方法
方法1:SimpleXML + XPath处理命名空间
利用SimpleXML的XPath功能,先注册XML中用到的所有命名空间,再精准查询目标节点:
// 加载CURL返回的XML响应 $xml = simplexml_load_string($response); // 注册XML中涉及的命名空间 $xml->registerXPathNamespace('s', 'http://schemas.xmlsoap.org/soap/envelope/'); $xml->registerXPathNamespace('default', 'http://centiro.com/facade/tmsBasic/1/0/servicecontract'); $xml->registerXPathNamespace('a', 'http://schemas.datacontract.org/2004/07/Centiro.Facade.TMSBasic.Contract.c1.i1.TMSBasic.BaseTypes.DTO'); // 使用XPath定位Content节点 $contentNodes = $xml->xpath('//s:Body/default:AddAndPrintShipmentResponse/default:ParcelDocuments/a:ParcelDocument/a:Content'); // 提取并输出内容 if (!empty($contentNodes)) { $content = (string)$contentNodes[0]; echo $content; // 输出:This my content }
方法2:DOMDocument + DOMXPath解析
如果更习惯DOM操作,可使用DOMDocument配合XPath查询:
$dom = new DOMDocument(); $dom->loadXML($response); $xpath = new DOMXPath($dom); // 注册所需命名空间 $xpath->registerNamespace('s', 'http://schemas.xmlsoap.org/soap/envelope/'); $xpath->registerNamespace('default', 'http://centiro.com/facade/tmsBasic/1/0/servicecontract'); $xpath->registerNamespace('a', 'http://schemas.datacontract.org/2004/07/Centiro.Facade.TMSBasic.Contract.c1.i1.TMSBasic.BaseTypes.DTO'); // 查询目标节点 $contentNode = $xpath->query('//s:Body/default:AddAndPrintShipmentResponse/default:ParcelDocuments/a:ParcelDocument/a:Content')->item(0); if ($contentNode) { $content = $contentNode->nodeValue; echo $content; // 输出:This my content }
方法3:转换为JSON/数组后提取(可选)
若需要将整个XML转为数组或JSON,可先处理命名空间再转换:
$xml = simplexml_load_string($response); $xml->registerXPathNamespace('a', 'http://schemas.datacontract.org/2004/07/Centiro.Facade.TMSBasic.Contract.c1.i1.TMSBasic.BaseTypes.DTO'); // 定位Content节点 $contentNodes = $xml->xpath('//a:Content'); if (!empty($contentNodes)) { // 转为JSON再转数组 $jsonStr = json_encode($contentNodes[0]); $contentArray = json_decode($jsonStr, true); echo $contentArray; // 输出节点内容 }
内容的提问来源于stack exchange,提问作者Sylar
相关产品推荐
相关产品推荐

