在Perl中使用单节点XML文件时出现问题

时间:2015-01-12 17:07:51

标签: xml perl xml-simple

我有很多多节点XML文件,我用XML::Simple解析。到目前为止它的效果很好。我做的第一件事就是使用这个来获取XML文件的长度(节点数):

my $xmltemp = XML::Simple->new(
    SuppressEmpty => 1
);

my $product = $xmltemp->XMLin('xml/' . $basename . '.xml');

my $qfr = @{ $product->{$basename}};
print "$qfr = qfr\n";

通过循环遍历文件名数组来提供变量$basename。节点名和文件名是相同的。

这适用于所有文件,但只有一个节点的文件除外。该程序试图创建$qfr变量。

如果我编辑其中一个单节点XML文件并创建另一个节点(欺骗现有节点)并重新运行,则可以正常工作。

导致单节点XML不响应简单标量变量赋值的错误是什么?

print行甚至不会执行。

注意:我剪切并粘贴了.pl和.pm中的重要代码,以便于掌握。

编辑:这是一个单节点XML样本:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<FUNDDATA>
  <FUND_DATA>
    <ADVISOR_FUND_CUSIP>316146703</ADVISOR_FUND_CUSIP>
    <ADVISOR_FUND_ID>01118</ADVISOR_FUND_ID>
    <ADVISOR_FUND_NAME>Pizza Fund - Class A</ADVISOR_FUND_NAME>
    <ADVISOR_FUND_SASID>01118</ADVISOR_FUND_SASID>
    <ALL_ADVISOR_CLASSES>01118,01123,01124,01125,01126</ALL_ADVISOR_CLASSES>
    <ALL_ADVISOR_CLASSES_CUSIPS>316146703,316146885,316146877,316146802,316146869</ALL_ADVISOR_CLASSES_CUSIPS>
    <ALL_ADVISOR_CLASSES_SASIDS>01118,01123,01124,01125,01126</ALL_ADVISOR_CLASSES_SASIDS>
    <ALL_ADVISOR_CLASSES_TYPES>A,B,C,T,I</ALL_ADVISOR_CLASSES_TYPES>
    <ALL_RETAIL_CLASSES>00026</ALL_RETAIL_CLASSES>
    <ALL_RETAIL_CLASSES_CUSIPS>316146109</ALL_RETAIL_CLASSES_CUSIPS>
    <ALL_RETAIL_CLASSES_SASIDS>00026</ALL_RETAIL_CLASSES_SASIDS>
    <ALL_RETAIL_CLASSES_TYPES>N</ALL_RETAIL_CLASSES_TYPES>
    <BUSINESS_UNIT>CCC</BUSINESS_UNIT>
    <DATE_ID>September 2000</DATE_ID>
    <PRIMARY_FUND_ID>000044</PRIMARY_FUND_ID>
    <RETAIL_FUND_CUSIP>44444</RETAIL_FUND_CUSIP>
    <RETAIL_FUND_ID>00026</RETAIL_FUND_ID>
    <RETAIL_FUND_NAME>Pizza Fund</RETAIL_FUND_NAME>
    <RETAIL_FUND_SASID>00026</RETAIL_FUND_SASID>
    <TRADE_SYMBOL>CCHCC</TRADE_SYMBOL>
  </FUND_DATA>
</FUNDDATA>

1 个答案:

答案 0 :(得分:1)

这只是您在使用XML::Simple时可能会发现的恶意之一。

在这种情况下有一个解决方案:您需要在构造函数调用中启用the ForceArray option,如此

my $xmltemp = XML::Simple->new(
    SuppressEmpty => 1,
    ForceArray    => 1,
);

文档对此有所说明

  

此选项应设置为&#39; 1&#39;强制嵌套元素   即使只有一个数组也表示为数组。