1

我正在进入 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.

诚然,我对复杂的数据结构有点模糊,但我想要解决的是当我们只有一个时如何解析这些所有者。

任何帮助都会很棒!珍妮

4

2 回答 2

7

试试这个:

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

它应该只强制“所有者”元素上的数组。

于 2013-02-12T20:57:59.743 回答
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";
}
于 2013-02-12T20:46:46.970 回答