... my $token = SOAP::Data->name('token' => 'value')->attr({xmlns => 'ns1'}); my $merchantId = SOAP::Data->name('merchantId' => 'value')->attr({xmlns => '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 ...