SOAP request with attribute
php, soap, soap-client
Solution
For this, you need to derived the class from SoapClient and Override the method __doRequest():
class ABRSoapClient extends SoapClient {
// return xml request
function __doRequest($request, $location, $action, $version) {
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->preserveWhiteSpace = false;
$xml= $dom->loadXML($request);
// Goto request Node and Set the attribute
$attr_ns = $dom->createAttributeNS('xmlns:ns', '' ); // instead of xmlns:ns use Namespace URL
$attr_ns->value = '/some/ns';
// add atribute in businessReport node
$dom->getElementsByTagName($report_type)->item(0)->appendChild( $attr_ns );
$request = $dom->saveXML();
return parent::__doRequest($request, $location, $action, $version);
}
}
$client = new ABRSoapClient(.....);
$save_result = $client->request($param);
// You can check the form request using function
$client->__getLastRequest();
I hope this will resolve your problem.
Problem
I can not seem to find out how to set an attribute to a SOAP request without using the XSD_ANYXML encoding. The request parameter should look as follows ``` <request xmlns:ns="/some/ns"> ... <ns:parameter attr="some attribute"> value </ns:parameter> ... </request> ``` Of course the following code works, but it's rather ugly (ugly, because it uses string concatenation where it should use the SOAP_Client API and because it does not use the general namespace) ``` $param = new SoapVar( '<ns_xxx:parameter xmlns:ns_xxx="/some/ns" attr="some attribute"> value </ns_xxx:parameter>', XSD_ANYXML ); ``` Is there a better way to create a SOAP request parameter with a namespace and an attribute? I am looking for s.th. like the following (this is just some pseudo code using the SoapVar API): ``` $param = new SoapVar( array( '_' => 'value', 'attr' => 'some attribute' ), SOME_ENCODING, null, null, null, '/some/ns' ); ```