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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:20:40