http://qs1969.pair.com?node_id=968892


in reply to SOAP-Lite Empty Strings

See Re: Suppressing nil attribute in empty SOAP tag and Re: I do not understand how to write a SOAP server. and switch away from SOAP::Lite :) because this is eew

#!/usr/bin/perl -- use strict; use warnings; use SOAP::Lite; my $param = SOAP::Data->type("xsd:string")->name( "EmptyEmptorIsEmpty" )->value( '' ); ## track down sub tag #~ use Devel::TraceCalls { Package => 'SOAP::Serializer' }; #~ SOAP::Serializer->envelope( method => 'DoThis', $param ); exit; my $soap = SOAP::Lite ->proxy( 'http://localhost/blah/DummyService', timeout => 0.00001, ); $soap->transport->add_handler("request_send", \&pp_dump ); $soap->serializer( MySerializer->new ); print pp( $soap->serializer()->envelope( method => 'DoThis', $param ), ), "\n\n"; $soap->call( 'DoThis', $param ); sub pp { use XML::Twig; open my($fh), '>', \my $str; no warnings 'newline'; XML::Twig->new( qw! pretty_print record ! )->parse( @_ )->print( $fh ); return $str; } sub pp_dump { { my $content = $_[0]->content(''); $_[0]->content( pp($content) ); } print $_[0]->as_string,"\n"; return; } BEGIN { package MySerializer; @MySerializer::ISA = 'SOAP::Serializer'; BEGIN { $INC{'MySerializer.pm'} = __FILE__; } my $closer = 'EmptyEmptorIsEmpty'; sub tag { my $self = shift; my $tag = shift; my $ret = $self->SUPER::tag( $tag, @_ ); if( $tag eq $closer and not $ret =~ m{</\Q$closer\E>$} ){ chop $ret; chop $ret; return "$ret></$closer>"; } return $ret; } 1; } __END__ POST http://localhost/blah/DummyService HTTP/1.1 Accept: text/xml Accept: multipart/* Accept: application/soap User-Agent: SOAP::Lite/Perl/0.714 Content-Length: 448 Content-Type: text/xml; charset=utf-8 SOAPAction: "#DoThis" <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/enc +oding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns: +soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http:/ +/www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSche +ma-instance"> <soap:Body> <DoThis> <EmptyEmptorIsEmpty xsi:type="xsd:string"> </EmptyEmptorIsEmpty> </DoThis> </soap:Body> </soap:Envelope>