Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml SOAP::Data::Builder,删除xsi:nil=";“真的”;当没有提供价值时_Xml_Perl_Soap - Fatal编程技术网

Xml SOAP::Data::Builder,删除xsi:nil=";“真的”;当没有提供价值时

Xml SOAP::Data::Builder,删除xsi:nil=";“真的”;当没有提供价值时,xml,perl,soap,Xml,Perl,Soap,如果我编写此代码(其中,$sb是SOAP::Data::Builder对象) 它生成以下内容 <ccAuthService xsi:nil="true" run="true" /> 这是不可接受的,因为xsi:nil会导致接收端出现问题。但是,如果我取消注释注释掉的行,我会得到 <ccAuthService run="true"> </ccAuthService> 从技术上讲,这是可行的,所以这是一个解决办法。但我最终想要的是 <ccAuth

如果我编写此代码(其中,
$sb
是SOAP::Data::Builder对象)

它生成以下内容

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

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

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

从技术上讲,这是可行的,所以这是一个解决办法。但我最终想要的是

<ccAuthService run="true" />


我知道它是有效的,但我就是不知道如何生成它。

您可以让XML生成保持在SOAP中,在发送端用解析器(如
XML::Twig
)解析生成的代码,然后用相同的库打印出来,应用在接收端成功处理该元素所需的选项。

$sb接收元素并通过xslt处理器将其提供给SOAP消息。 你能在这个过程中插入“中间人”逻辑吗

在我的例子中,我使用wsdl生成了一个.Net 4 C#SoapHttpClientProtocol对象,该对象有一个虚拟方法,我可以重写该方法,称为GetWritePerformMessage。此方法返回用于写出SOAP消息的XmlWriter对象(本质上是xslt处理器)。我创建了一个自定义XmlWriter,它忽略了“本地名为nil的write-out属性”命令

这个解决方案的优点在于它是通用的。所以,现在它是我的库的一部分,我可以在任何时候“过滤”任何Xml输出时使用它。它只需要一个自定义类

看起来你的代码是c??也许$sb有一个指针可以设置为将它的“xml编写器”重定向到自定义方法


希望这能帮助别人。

我也有同样的问题,这就是我解决问题的方法,也许这也能帮助别人

设置“xsi:nil=true”如果soap数据对象的值未定义,请将其设置为arrayref以解决此问题

请参考以下代码:

Soap格式:

< m:clHotelIdInfo>< m:HotelIdInfo xsi:nil=true  id="1219615" />< /m:clHotelIdInfo>
预期的Soap格式:

< m:clHotelIdInfo>< m:HotelIdInfo id="1219615" /></ m:clHotelIdInfo>                                                         
如果仔细观察这些对象,HotelIdInfo的值在前面是未定义的,当更改为arrayref时,它帮助我摆脱了“xsi:nil=true”


我不必更改cpan的任何现有模块。只需设置值arrayref而不是undef。这是一个perl语言的解决方案。

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

在代码中的某个地方定义以下内容:

sub-SOAP::Serializer::as\u nonil
{
我的($self,$value,$name,$type,$attr)=@;
删除$attr->{'xsi:nil'};
返回[$name,$attr,$value];
}
要使用此类型,请执行以下操作:

SOAP::Data->new(
类型=>'nonil',
name=>“ping”,
前缀=>'',
uri=>'http://myschema.domain/',
);

这里有一些提示。

这听起来比我现在的解决方案糟糕10倍左右。我宁愿给处理器发送一个''。对我来说,这听起来好几百万倍,因为你不必依赖黑客和特定于实现的“变通方法”。你不知道我已经需要处理多少变通方法。。。接收端未使用sane分析。。。这增加了一层复杂性,需要我重写。你一定是在开玩笑吧!你的工作要求你。。。写代码?从没听说过程序员会这么做!很抱歉,现在我发现我的答案对你来说是完全无用的。为什么我要对我已经在工作但不是最优的东西进行50%或更多的代码重写呢。
*bless( {
     '_name' => 'clHotelIdInfo',
     '_signature' => [],
     '_value' => [
                   \bless( {
                              '_signature' => [],
                              '_value' => [
                                            bless( {
                                                     '_name' => 'HotelIdInfo',
                                                     '_signature' => [],
                                                     **'_value' => [
                                                                   undef
                                                                 ],**
                                                     '_prefix' => 'm',
                                                     '_attr' => {
                                                                  'id' => '1219615'
                                                                }
                                                   }, 'SOAP::Data' )
                                          ],
                              '_attr' => {}
                            }, 'SOAP::Data' )
                 ],
     '_prefix' => 'm',
     '_attr' => {}
 }, 'SOAP::Data' )*
< m:clHotelIdInfo>< m:HotelIdInfo id="1219615" /></ m:clHotelIdInfo>                                                         
*bless( {
         '_name' => 'clHotelIdInfo',
         '_signature' => [],
         '_value' => [
                       \bless( {
                                  '_signature' => [],
                                  '_value' => [
                                                bless( {
                                                         '_name' => 'HotelIdInfo',
                                                         '_signature' => [],
                                                         **'_value' => [],**
                                                         '_prefix' => 'm',
                                                         '_attr' => {
                                                                      'id' => '1219615'
                                                                    }
                                                       }, 'SOAP::Data' )
                                              ],
                                  '_attr' => {}
                                }, 'SOAP::Data' )
                     ],
         '_prefix' => 'm',
         '_attr' => {}
}, 'SOAP::Data' )*