我有一个 XML 字符串,我使用 LibXML 对其进行解析的 findnodes
和 textContent
,效果很好:
#!/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/