sub soap_xml_data { my ($value) = @_; return Akar::SOAP::Data::XMLLiteral->new_data($value); } package Akar::SOAP::Data::XMLLiteral; use strict; use SOAP::Lite; our @ISA = qw(SOAP::Data); # the constructor new_data to avoid conflict with SOAP::Data->new sub new_data { my ( $package, $value ) = @_; # value can be text, XML::LibXML::Document, XML::LibXML::Element my $node = !ref($value) ? XML::LibXML->new->parse_string($value)->documentElement : UNIVERSAL::isa( $value, 'XML::LibXML::Element' ) ? $value : UNIVERSAL::isa( $value, 'XML::LibXML::Document' ) ? $value->documentElement : die "Invalid param of XML data\n "; # 2007-09-12 danielr, I guess that the text for SOAP::Lite # should be byt not character UTF8 otherwise # Wide character error occur as it was in cabernet my $text = $node->toString; if (Encode::is_utf8($text)){ $text = Encode::encode('utf-8', $text); } my $data = SOAP::Data->new( 'type' => 'xml', 'value' => $text, 'name' => $node->localname, 'prefix' => $node->prefix, 'uri' => $node->namespaceURI, ); return bless $data => $package; } # object can't be broken by set_value sub set_value { return shift(); }