xml - Perl XML::LibXML 与 SOAP::SOM

标签 xml perl soap xml-parsing libxml2

我有一个 XML 字符串,我使用 LibXML 对其进行解析的 findnodestextContent,效果很好:

#!/usr/bin/perl -w

use strict;
use warnings;

use SOAP::Lite 0.715;
use Data::Dumper;
use XML::LibXML qw();

my $cust_xml  = '<?xml version="1.0" standalone="yes"?>
<CUSTOMER_RESPONSE>
  <CUSTOMER>
    <TEL>555-555-5555</TEL>
  </CUSTOMER>
  <PRODUCTS>
    <PRODUCT>
      <PRODUCT_ID>Apple</PRODUCT_ID>
    </PRODUCT>
    <PRODUCT>
      <PRODUCT_ID>BlackBerry</PRODUCT_ID>
    </PRODUCT>
    <PRODUCT>
      <PRODUCT_ID>Orange</PRODUCT_ID>
    </PRODUCT>
  </PRODUCTS>
</CUSTOMER_RESPONSE>
';

my $dom = XML::LibXML->load_xml(string => $cust_xml);
for my $productNode ($dom->findnodes('//PRODUCT_ID')) {
    my $product_id = $productNode->textContent;
    print STDERR "id=$product_id\n";
}

但是,我的目标计算机(HP-UX 上的 Perl 5.8.8)不包含 XML::LibXML我希望我可以使用 SOAP::SOM 实现同样的目标。但是,我似乎无法获得正确的语法:

my $som = SOAP::SOM->new($cust_xml);
for my $productNode ($som->valueof('//PRODUCTS/PRODUCT')) {
    my $product_id = $productNode->{'PRODUCT_ID'};
    print STDERR "id=$product_id\n";
}

当我运行上面的代码片段时,出现运行时错误:

% ./som.pl
Can't use string ("<?xml version="1.0" standalone=""...) as an ARRAY ref while "strict refs" in use at /Users/<username>/perl5/lib/perl5/SOAP/Lite.pm line 391.

您有什么建议,甚至推荐另一个可能在旧机器上找到的通用库吗?

-总部

最佳答案

这是一种非常奇怪的 XML 解析方法。是否没有其他有效的XML模块可以使用,例如XML::Twig

SOAP::SOM 期望其构造函数的参数中不只是纯 XML。它通常是通过使用 SOAP::Lite 访问远程 SOAP 服务器来创建的。 .

您需要使用SOM::Deserializer,如下所示

use strict;
use warnings;

use SOAP::Lite;

my $cust_xml  = <<'__END_XML__';
<CUSTOMER_RESPONSE>
  <CUSTOMER>
    <TEL>555-555-5555</TEL>
  </CUSTOMER>
  <PRODUCTS>
    <PRODUCT>
      <PRODUCT_ID>Apple</PRODUCT_ID>
    </PRODUCT>
    <PRODUCT>
      <PRODUCT_ID>BlackBerry</PRODUCT_ID>
    </PRODUCT>
    <PRODUCT>
      <PRODUCT_ID>Orange</PRODUCT_ID>
    </PRODUCT>
  </PRODUCTS>
</CUSTOMER_RESPONSE>
__END_XML__

my $som = SOAP::Deserializer->deserialize($cust_xml);

print "$_\n" for $som->valueof('//PRODUCT_ID');

输出

Apple
BlackBerry
Orange

关于xml - Perl XML::LibXML 与 SOAP::SOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22595419/

相关文章:

ajax - HTML5 发布请求正文

c# - 如何用前缀替换 xmlns 命名空间属性?

Android Studio - 顶部的白色条

perl - 将数组存储在哈希中

linux - 管道打开 '|' 和 '|-' 之间的区别(安全管道打开)

json - CMakeLists 解析文件

perl - 如何通过 SSL 下载 IMAP 邮件附件并使用 Perl 将它们保存在本地?

java - 如何创建包装器来区分 2 个或更多独立 Web 服务应用程序

java - WSDL 中 SOAP 地址位置上的 JMS : What does it mean?

web-services - SOAP 网络服务中的 WS Security 1.2 Delphi XE8 for sign body