如何使用Perl从深层嵌套的XML文件中解析/提取值列表

时间:2014-10-07 22:28:13

标签: xml perl xml-parsing xml-simple

如何从嵌套值良好的XML文件中解析/提取值列表?

我尝试过XML Simple,我只能从超过10个值的列表中提取第一个值。我想首先选择seriesName" Temperature"并提取该组下的值。

这是我正在解析T124.xml的XML文件(我已经将其作为一个巨大的文件而被删除):

<chart caption="" subcaption="" palette="6" yAxisMinVal="11800" yAxisMaxVal=17800"xmlns="http: ">
<categories>
<category label=""/>
<category label=""/>
<category label=""/>
<category label=""/>
<category label=""/>
<category label="6"/>
<category label=""/>
<category label=""/>
<category label=""/>
<category label=""/>
<category label="12"/>
<category label=""/>
<category label=""/>
<category label="18"/>
<category label=""/>
<category label=""/>
<category label="21"/>
<category label=""/>
</categories>
- <dataset seriesName="Temperature" color="003366">
<Set value=675.0"/>
<Set value=613.0"/>
<Set value=612.0"/>
<Set value=614.0"/>
<Set value=613.0"/>
<Set value=413.0"/>
<Set value=613.0"/>
<Set value=313.0"/>
<Set value=213.0"/>
<Set value=653.0"/>
<Set value=633.0"/>
<Set value=623.0"/>
</dataset>
<dataset seriesName="Precipitation" color="66CC33">
<set value="50.6"/>
</dataset>
</chart>

以下是我使用的Perl代码:

#!/usr/bin/perl
use strict; 
use XML::Simple 'XMLin';
use Data::Dumper;

my $parse = XMLin('T124.xml',forcearray => ['value']);
#print Dumper($parse);

foreach my $dataset (@{$parse->{dataset}}) {
    if ($dataset->{seriesName} eq 'Temperature') {
        print $dataset->{seriesName} . "\n";
        print $dataset->{set}->[0]->{value} . "\n";
    }
}

我想看到以下输出(如下所示),但我只能提取第一个675.0值:

Temperature
675.0 
613.0
612.0
614.0
613.0 

... ETC

1 个答案:

答案 0 :(得分:1)

这是一个从XML中提取温度数据的简单脚本。我在这里包含了XML源代码,因为您提供的源代码似乎缺少某些"。我已使用XML::Twig来解析数据。

#!/usr/bin/perl
use warnings;
use strict;
use XML::Twig;

my $xml = '<chart caption="" subcaption="" palette="6" yAxisMinVal="11800" yAxisMaxVal="17800" xmlns="http://">
<categories>
<category label=""/>
<category label=""/>
<category label=""/>
<category label=""/>
<category label=""/>
<category label="6"/>
<category label=""/>
<category label=""/>
<category label=""/>
<category label=""/>
<category label="12"/>
<category label=""/>
<category label=""/>
<category label="18"/>
<category label=""/>
<category label=""/>
<category label="21"/>
<category label=""/>
</categories>
<dataset seriesName="Temperature" color="003366">
<Set value="675.0"/>
<Set value="613.0"/>
<Set value="612.0"/>
<Set value="614.0"/>
<Set value="613.0"/>
<Set value="413.0"/>
<Set value="613.0"/>
<Set value="313.0"/>
<Set value="213.0"/>
<Set value="653.0"/>
<Set value="633.0"/>
<Set value="623.0"/>
</dataset>
<dataset seriesName="Precipitation" color="66CC33">
<set value="50.6"/>
</dataset>
</chart>';

my $t = XML::Twig->new();
$t->parse( $xml );   # or $t->parsefile( $filename ); to read from a file

# this xpath finds all <Set> elements under the <dataset> element
# where attribute "seriesName" = "Temperature"
my @sets = $t->findnodes('//dataset[@seriesName="Temperature"]/Set');

if (@sets) {

    my $outfile = '/path/to/output/file.txt';
    open my $out, ">", $outfile or die "Could not open $outfile: $!";
    print { $out } "Temperature\n";
    print { $out } $_->att('value')."\n" for @sets;
}

输出:

Temperature
675.0
613.0
612.0
614.0
613.0
413.0
613.0
313.0
213.0
653.0
633.0
623.0