blogですかい

仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

PHPのSoapClientで、名前空間の接頭辞をns1から任意のものに変えたい場合

<?php
/**
 * SoapClientを継承するクラスにて、__doRequest()メソッドをオーバーライドする
 */
class MySoapClient extends SoapClient {
    public function __doRequest($request, $location, $action, $version, $one_way = 0) {
        $request = preg_replace('/xmlns:ns1/', 'xmlns:myns', $request);
        $request = preg_replace('/<ns1:/', '<myns:', $request);
        $request = preg_replace('/<\/ns1:/', '</myns:', $request);
        return parent::__doRequest($request, $location, $action, $version, $one_way);
    }
}

$soapObj = new MySoapClient(
    null,
    array(
        'soap_version' => SOAP_1_1,
        'location' => 'http://example.com/',
        'uri' => 'http://example.com/',
        'use' => SOAP_LITERAL,
    ));

$soapObj->MethodName( new SoapParam('value', 'param') );

上記のように、SoapClientクラスを継承し、オーバーライドした__doRequest()メソッドにて ns1 を任意の文字列に置換すれば、下記のようなリクエストをサーバに送ることができる。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myns="http://example.com">
  <SOAP-ENV:Body>
    <myns:MethodName>
      <param>value</param>
    </myns:MethodName>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>