perl - 如何修复 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
?
解决方案
有什么我必须打开的特殊选项吗?还是我必须在将其设置为值之前为自己进行 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 & Co.'
],
'_attr' => {},
'_name' => 'company_name',
'_signature' => []
}, 'SOAP::Data' );
推荐阅读
- reactjs - 如何一次使用 onclick 和 push state 到 props ?我有推送是 undef 错误
- android - 如何从资源中设置改造 URL 字符串
- python - 如何将 python ndarray 转换为 c++ char*?
- ios - 在 App Center 和 App Insights 中设置使用情况分析
- django - 如何使用 /download/ 扩展我的端点?
- amp-html - 如何在 amphtml 的过滤下拉列表中对结果进行排序?
- c++ - 如何在 C++ 中以编程方式显示 macOS 上所有正在运行的进程?
- android - 更改 RecyclerView 项目上的项目背景
- mysql - $scope 在 app.js 文件中不起作用。但是当 HTML 文件包含 app.js 文件的内容时,$scope 有效
- android - Gluon 移动视频服务不适用于本地存储在 android 设备上的媒体文件?