DreamT has asked for the wisdom of the Perl Monks concerning the following question:

Hi! I'm trying to make a nested call with multiple namespaces, that's supposed to create this code:
Host: ... Connection: Keep-Alive User-Agent: PHP-SOAP/5.2.4 Content-Type: text/xml; charset=utf-8 SOAPAction: "http://..." Content-Length: 1187 <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://..." xmlns:ns2="http://..."> <SOAP-ENV:Body> <ns1:Setup> <ns1:token>value</ns1:token> <ns1:merchantId>value</ns1:merchantId> <ns1:request> <ns2:Amount>value</ns2:Amount> <ns2:CurrencyCode>value</ns2:CurrencyCode> <ns2:CustomerEmail>value</ns2:CustomerEmail> <ns2:CustomerPhoneNumber>123 45 678</ns2:CustomerPhoneNumber> <ns2:Description>value</ns2:Description> <ns2:Language>value</ns2:Language> <ns2:OrderDescription>value</ns2:OrderDescription> <ns2:OrderNumber>value</ns2:OrderNumber> <ns2:PanHash></ns2:PanHash> <ns2:RecurringExpiryDate></ns2:RecurringExpiryDate> <ns2:RecurringFrequency></ns2:RecurringFrequency> <ns2:RecurringType></ns2:RecurringType> <ns2:RedirectUrl>http://localhost/...</ns2:RedirectUrl> <ns2:ServiceType>B</ns2:ServiceType> <ns2:SessionId>...</ns2:SessionId> <ns2:TransactionId>...</ns2:TransactionId> </ns1:request> </ns1:Setup>
My questions are:
1. How do I create multiple namespaces?
2. How do I assign the different values to the different namespaces?

Replies are listed 'Best First'.
Re: SOAP::Lite - Multiple namespaces
by olus (Curate) on Mar 17, 2009 at 16:37 UTC

    something like (untested)

    ... my $token = SOAP::Data->name('token' => 'value')->attr({xmlns => +'ns1'}); my $merchantId = SOAP::Data->name('merchantId' => 'value')->attr({xmln +s => 'ns1'}); my %request = ( 'Amount' => 'value', 'CurrencyCode' => 'value', 'CustomerEmail' => 'value', #.... ); my @request_values = (); foreach my $r (keys %request) { push @request_values, SOAP::Data->name($r => $request{$r})->attr({xmlns => 'ns2'}); } my $request = ( SOAP::Data->name('request' => \SOAP::Data->value( @request_values ) )->attr({xmlns => 'ns1'}) ); my @setup_values = (); push @setup_values, $token, $merchantId, $request; my $setup = ( SOAP::Data->name('Setup' => \SOAP::Data->value( @setup_values ) )->attr({xmlns => 'ns1'}) ); # pass $setup as a param to the method to be called ...
      Worked like a charm - and made sense too:-)
      Thank you for your help, I really appreciate it.