首页 > 解决方案 > 如何修复 SOAP::Lite 生成的损坏的 XML

问题描述

目前我正在使用某些基于 SOAP 的 Web 服务;我想使用 SOAP::Lite 与这些服务进行通信。

在第一次测试中,一切正常;直到我的&数据中有一个与号 ( )。

执行请求时,我使用以下代码段执行此操作:

my $or_client = SOAP::Lite->new(
    proxy => '...',
    readable => 1,
    autotype => 0,
);
my $or_response = $or_client->call(
    'aMethod',
    SOAP::Data->name('company_name')->value('ACME'),
    ...
);

当我启用跟踪(添加行SOAP::Lite->import(trace => 'debug');)时,我可以看到以下数据发送到服务器:

<soap:Envelope 
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
...>
    <soap:Body>
        <ns:aMethod>
            <company_name>ACME</company_name>
            ...
        </ns:aMethod>
    </soap:Body>
</soap:Envelope>

这工作没有任何问题。但是当我的数据对象的值包含特殊字符时:

SOAP::Data->name("company_name")->value("ACME & Co.")

然后我得到一个 500 Internal Server 错误;带有错误字符串“意外字符''(代码32)(缺少名称?)...”

我检查了发送到 SOAP 服务的 XML,我注意到“ACME & Co”中的“&”不是以正确方式转义的 XML:

<company_name>ACME & Co.</company_name>

有什么我必须打开的特殊选项吗?还是我必须在将其设置为之前为自己进行 XML 转义value

标签: perlsoap

解决方案


有什么我必须打开的特殊选项吗?还是我必须在将其设置为值之前为自己进行 XML 转义?

你可以这样做:

SOAP::Data->name("company_name")->value(SOAP::Utils::encode_data("ACME & Co."))

证明:

  DB<3> $m = SOAP::Data->name("company_name")->value(SOAP::Utils::encode_data("ACME & Co."));

  DB<6> use Data::Dumper

  DB<7> print Dumper $m
$VAR1 = bless( {
                 '_value' => [
                               'ACME &amp; Co.'
                             ],
                 '_attr' => {},
                 '_name' => 'company_name',
                 '_signature' => []
               }, 'SOAP::Data' );

推荐阅读