使用Perl的XML :: Simple时不是ARRAY参考

时间:2013-02-12 20:44:47

标签: xml perl parsing

我正在进入XML :: Simple并且在解析一条记录时遇到了XML :: Simple模块阻塞的问题。 perl代码低于.....

#!/usr/bin/perl
# use module
use warnings;
use strict;
use XML::Simple;
use Data::Dumper;

# create object
my $xml = new XML::Simple;

# read XML file
my $data = $xml->XMLin("owners.xml");

foreach my $e (@{$data->{Owner}})
{
     print $e->{OwnerId}->{OwnerCik}."\n";
     print $e->{OwnerId}->{OwnerName}."\n";
     print "\n";
}

当我使用这个XML时,它可以很好地工作......

<?xml version="1.0"?>
<ownershipDocument>
    <Owner>
        <OwnerId>
            <OwnerCik>0001234878</OwnerCik>
            <OwnerName>PUBLIC JOHN Q</OwnerName>
        </OwnerId>
    </Owner>
    <Owner>
        <OwnerId>
            <OwnerCik>0001234877</OwnerCik>
            <OwnerName>PUBLIC JANE Q</OwnerName>
        </OwnerId>
    </Owner>
</ownershipDocument>

当我有一条记录时,我遇到了问题......下面的XML就是一个例子......

<?xml version="1.0"?>
<ownershipDocument>
    <Owner>
        <OwnerId>
            <OwnerCik>0001234878</OwnerCik>
            <OwnerName>PUBLIC JOHN Q</OwnerName>
        </OwnerId>
    </Owner>
</ownershipDocument>

解析时遇到的错误是.....

Not an ARRAY reference at ./so_parse.pl line 14.

我认为解决方案是使用ForceArray并将其更改为包含ForceArray ..

my $data = $xml->XMLin("so_single.xml", ForceArray=>1);

现在我明白了......

Not a HASH reference at ./so_parse.pl line 16.

不可否认,我对复杂的数据结构有点朦胧,但我想解决的是如何解析这些所有者只有一个。

任何帮助都会很棒! 珍妮

2 个答案:

答案 0 :(得分:7)

试试这个:

my $data = $xml->XMLin("so_single.xml", ForceArray=>['Owner']);

“所有者”元素上只应force the array

答案 1 :(得分:3)

这是逻辑和正常的。在第一个XML文件中,您有多个所有者,而不是第二个XML文件。当你这样做

my $data = $xml->XMLin("owners.xml");

您在Perl数据结构中“转换”XML,并且重复的节点位于Perl数组中,而不是其他节点。

你能做什么呢?

#!/usr/bin/perl
# use module
use warnings;
use strict;
use XML::Simple;
use Data::Dumper;

# create object
my $xml = new XML::Simple;

# read XML file
my $data = $xml->XMLin("owners.xml");

# if $data->{Owner} is an ARRAY ref
if (ref($data->{Owner}) =~ /ARRAY/) {
    foreach my $e (@{$data->{Owner}}) {
         print $e->{OwnerId}->{OwnerCik}."\n";
         print $e->{OwnerId}->{OwnerName}."\n";
         print "\n";
    }
} else {
    print $data->{Owner}->{OwnerId}->{OwnerCik}."\n";
    print $data->{Owner}->{OwnerId}->{OwnerName}."\n";
}