1

如何从具有良好嵌套值的 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...

4

1 回答 1

1

这是一个从 XML 中提取温度数据的简单脚本。我在这里包含了 XML 源代码,因为您提供的源代码似乎缺少一些"s. 我习惯于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
于 2014-10-07T23:28:39.787 回答