少なくとも、生成された XML コードを出力する方法を見つけました。
まず、raina77ow が提案したように、 SOAP::WSDL::Clientを調べました。しかし、それは私が必要としていたものではありませんでした。しかし、その後、SOAP::WSDL::Factory::Serializerに出会いました。そこには、次のように書かれています。
シリアライザー オブジェクトは、set_serializer メソッドを使用して SOAP::WSDL::Client に直接渡すこともできます。
少しいじって、 SOAP::WSDL::Serializer::XSDのラッパー クラスを思いつきました。これは、 SOAP::WSDLで使用されるデフォルトのシリアライザーです。コードを見ることも役に立ちました。
これが私が書いたモジュールです。SOAP::WSDL::Serializer::XSD
基本クラスとして使用し、メソッドnew
とserialize
メソッドをオーバーロードします。に引数を渡すだけですがnew
、 から返された XML を取得してserialize
出力します。これでデバッグには十分です。簡単に入手できる場所に置く方法があるかどうかはわかりません。
package MySerializer;
use strict;
use warnings;
use base qw(SOAP::WSDL::Serializer::XSD);
sub new {
my $self = shift;
my $class = ref($self) || $self;
return $self if ref $self;
# Create the base object and return it
my $base_object = $class->SUPER::new(@_);
return bless ($base_object, $class);
}
sub serialize {
my ($self, $args_of_ref) = @_;
# This is basically a wrapper function that calls the real Serializer's
# serialize-method and grabs and prints the returned XML before it
# giving it back to the caller
my $xml = ref($self)->SUPER::serialize($args_of_ref);
print "\n\n$xml\n\n"; # here we go
return $xml;
}
1;
そして、これが私がそれを呼び出す方法です:
my $serializer = MySerializer->new();
$self->{'_interface'} = Lib::Interfaces::MyInterface->new();
$self->{'_interface'}->set_serializer($serializer); # comment out to deactivate
無効にするのは簡単です。行にコメントを入れるだけset_serializer
です。
もちろん、XML のブロックをコマンド ラインに出力するのはあまりきれいではありませんが、仕事は完了します。コーディング/テストのためにたまにしか必要ないので、これで問題ないと思います。