我找到了一种至少打印出生成的 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
andserialize
方法。虽然它只将参数传递给new
,但它会从中获取返回的 XMLserialize
并打印出来,这足以进行调试。我不确定是否有办法将它放在我可以轻松获取它的地方。
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 打印到命令行不是很漂亮,但它可以完成工作。我只是偶尔需要它为什么编码/测试,所以我猜这很好。