如何调整SoapServer响应中命名空间定义的位置?
PHP SoapServer 调整命名空间声明位置:从Envelope移至ResponseWS标签
问题场景
使用PHP SoapServer构建Web服务时,默认生成的SOAP响应会将自定义命名空间声明放在SOAP-ENV:Envelope标签上,但服务调用方要求必须将该命名空间声明移至ns1:ResponseWS标签内部。
当前响应(不符合要求)
SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/responsens"> <SOAP-ENV:Body> <ns1:ResponseWS> <ns1:childLabel> <ns1:labelOne>XXXXXXXXXXX</ns1:labelOne> <ns1:labelTwo>XXXXXXX</ns1:labelTwo> </ns1:childLabel> </ns1:ResponseWS> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
期望响应(符合要求)
SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <ns1:ResponseWS xmlns:ns1="http://example.com/responsens"> <ns1:childLabel> <ns1:labelOne>XXXXXXXXXXX</ns1:labelOne> <ns1:labelTwo>XXXXXXX</ns1:labelTwo> </ns1:childLabel> </ns1:ResponseWS> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
已尝试的无效方案
- 修改WSDL文件
- 在响应数据中使用
SoapVar对象
可行解决方案:通过输出缓冲区修改响应XML
利用PHP输出缓冲区捕获SoapServer生成的响应内容,通过正则替换调整命名空间的声明位置,步骤如下:
- 开启输出缓冲区
- 让SoapServer处理请求并生成响应(内容暂存于缓冲区)
- 获取缓冲区中的XML内容
- 清空缓冲区
- 用正则移除Envelope标签上的命名空间声明
- 用正则在ResponseWS标签上添加命名空间声明
- 输出修改后的XML内容
示例代码
$server = new SoapServer(...); $server->setClass($class); // 开启输出缓冲区 ob_start(); $server->handle(); // 获取缓冲区中的SOAP响应内容 $soapXml = ob_get_contents(); // 清空缓冲区(避免输出原始内容) ob_end_clean(); // 移除Envelope标签上的ns1命名空间声明 $soapXml = preg_replace('/xmlns:ns1="http:\/\/example.com\/responsens"/', '', $soapXml); // 在ResponseWS标签上添加ns1命名空间声明 $soapXml = preg_replace('/<ns1:ResponseWS>/', '<ns1:ResponseWS xmlns:ns1="http://example.com/responsens">', $soapXml); // 输出修改后的响应 echo $soapXml;
内容的提问来源于stack exchange,提问作者Ama2r
相关产品推荐
相关产品推荐

