我正在进入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.
不可否认,我对复杂的数据结构有点朦胧,但我想解决的是如何解析这些所有者只有一个。
任何帮助都会很棒! 珍妮
答案 0 :(得分:7)
答案 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";
}