Perl 中的单节点 XML 文件出现问题
Trouble with a one-node XML file in Perl
我有许多正在使用 XML::Simple
解析的多节点 XML 文件。到目前为止效果很好。我做的第一件事就是使用这个获取 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>
这只是您在使用 XML::Simple
时可能发现的问题之一。
在这种情况下有一个解决方案:你需要在构造函数调用中启用the ForceArray
option,像这样
my $xmltemp = XML::Simple->new(
SuppressEmpty => 1,
ForceArray => 1,
);
文档对此有说明
This option should be set to '1' to force nested elements to be
represented as arrays even when there is only one.
我有许多正在使用 XML::Simple
解析的多节点 XML 文件。到目前为止效果很好。我做的第一件事就是使用这个获取 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>
这只是您在使用 XML::Simple
时可能发现的问题之一。
在这种情况下有一个解决方案:你需要在构造函数调用中启用the ForceArray
option,像这样
my $xmltemp = XML::Simple->new(
SuppressEmpty => 1,
ForceArray => 1,
);
文档对此有说明
This option should be set to '1' to force nested elements to be represented as arrays even when there is only one.