Como adicionar um namespace arbitrário com o PHP SoapClient?

Como um adiciona um namespace arbitrário usando o PHP SoapClient? O namespace realmente não se usa no pedido, mas acho que está impedindo que minha mensagem seja consumida corretamente.

O WSDL está aqui: http://abr.business.gov.au/abrxmlsearchRPC/ABRXMLSearch.asmx?WSDL

A documentação para a mensagem específica que eu quero enviar está aqui: http://abr.business.gov.au/abrxmlsearchRPC/(nye2ok45xc42vy552b15dx3t)/FormGenerator/ABRSearchByNameSimpleProtocol.aspx . Estou fazendo o pedido SOAP.

No soap: Envelope, você notará um espaço para nome chamado xmlns: types = “http://abr.business.gov.au/ABRXMLSearchRPC/encodedTypes”, e você também notará que não é usado no soap: Body.

A mensagem que estou enviando é: (newlines e indenting added for readability, authenticationGuid ofuscado para segurança)

    company  Y Y Y Y Y Y Y Y Y Y aaaa    

A resposta que recebo é:

             0001-01-01T00:00:00.0000000+11:00 2011-05-26T09:31:06.2949724+10:00         The GUID entered is not recognised as a Registered Party. Search GUID:  WebServices        Y Y   Y Y Y Y Y Y Y Y    

Parece que o consumidor desconsidera completamente o conteúdo da mensagem. O único que posso ver que falta no exemplo é o namespace de tipos, que está incluído na resposta.

Assim, estou pensando que, se eu puder adicionar arbitrariamente os tipos de espaço para nome ao pedido, pode ter melhor sorte.

Se alguém pudesse me dizer como fazer isso, ou oferecer alguma outra sugestão, porque o consumidor ignora os valores que eu dei no pedido, isso seria muito apreciado.

Atualização: Estender o SoapClient e replace __doRequest () para adicionar o namespace pode ser realmente a solução, mas eu gostaria de uma confirmação de alguém que conheça melhor. Note-se que o conteúdo de SoapClient :: getLastRequest () é gerado antes das modificações feitas por __doRequest (), portanto, qualquer modificação feita através de __doRequest () pode precisar ser observada através de um despejo tcp.

O código de exemplo para isso é

 class ABRSoapClient extends SoapClient { function __doRequest($request, $location, $action, $version) { $dom = new DOMDocument('1.0', 'UTF-8'); $dom->preserveWhiteSpace = false; $dom->loadXML($request); $dom->documentElement->setAttribute ('xmlns:types', 'http://abr.business.gov.au/ABRXMLSearchRPC/encodedTypes'); $request = $dom->saveXML(); error_log('Request in class:'.$request); return parent::__doRequest($request, $location, $action, $version); } }