如何从嵌套值良好的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
答案 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