1

XML :: Simpleに入り、1つのレコードを解析するときに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>

問題が発生するのは1つのレコードがある場合です...以下の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.

確かに、私は複雑なデータ構造に少しぼんやりしていますが、私が解決しようとしているのは、所有者が1人しかない場合にこれらの所有者を解析する方法です。

どんな助けでも素晴らしいでしょう!ジャニー

4

2 に答える 2

7

これを試して:

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

「所有者」要素の配列のみを強制する必要があります。

于 2013-02-12T20:57:59.743 に答える
3

これは論理的で正常です。最初の XML ファイルには複数の所有者がいますが、2 番目の XML ファイルにはありません。あなたがするとき

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

XML を Perl データ構造に「変換」すると、繰り返されるノードは、他のノードではなく 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 に答える