xml - SOAP::Data::Builder,当没有提供值时删除 xsi:nil ="true"

标签 xml perl soap

如果我写这个SOAP::Data::Builder代码(其中 $sb 是一个 SOAP::Data::Builder 对象)

    $sb->add_elem(
        attributes => { run => 'true' },
        name       => 'ccAuthService',
#       value      => ' ', # hack to prevent cs side unparseable xml
    );

它生成以下内容

<ccAuthService xsi:nil="true" run="true" />

这是 Not Acceptable ,因为 xsi:nil 会导致接收端出现问题。但是,如果我取消注释注释掉的行,我会得到

<ccAuthService run="true"> </ccAuthService>

从技术上讲这是可行的,因此这是一种解决方法。但我最终想要的是

<ccAuthService run="true" />

我知道这是可行的,但我不知道如何生成它。

最佳答案

这是解决 SOAP::Lite(SOAP::Data::Builder 使用的)这个问题的解决方案。

在您的代码中的某处定义以下内容:

sub SOAP::Serializer::as_nonil
{
    my ($self, $value, $name, $type, $attr) = @_;
    delete $attr->{'xsi:nil'};
    return [ $name, $attr, $value ];
}

要使用这种类型:

SOAP::Data->new(
   type => 'nonil',
   name => 'ping',
   prefix => '',
   uri => 'http://myschema.domain/',
);

关于这方面的一些提示在 SOAP::Serializer 中.

关于xml - SOAP::Data::Builder,当没有提供值时删除 xsi:nil ="true",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7070553/

相关文章:

python - 从模型数据生成 XML 文件

android - 启动应用程序时 TextView 中的奇怪错误

Java:将 StreamResult 保存到文件

perl中的正则表达式,匹配换行符和下一行的第一个单词

perl - 如何通过 Telnet 将 Tcl 数据结构传递给 Perl?

linux - SOAP:无法分配请求的地址

c# - WSDL Web 服务从 C# 返回空数组

javascript - XML : Cannot call method 'getElementsByTagName' of null

linux - 使用 -T 开关运行时 $ENV{PATH} 不安全

java - Camel CXF : IllegalArgumentException parameters should be of type X