Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl从深度嵌套的XML文件中解析/提取值列表_Xml_Perl_Xml Parsing_Xml Simple - Fatal编程技术网

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

如何使用Perl从深度嵌套的XML文件中解析/提取值列表,xml,perl,xml-parsing,xml-simple,Xml,Perl,Xml Parsing,Xml Simple,如何从嵌套良好的值的XML文件中解析/提取值列表? 我尝试过XML Simple,但我只能从超过10个值的列表中提取第一个值。我试图首先选择seriesName“Temperature”并提取该组下的值 这是我正在解析T124.XML的XML文件(我将其作为一个大文件进行了摘要): 我希望看到以下输出(如下所示),但我只能提取第一个675.0值: #!/usr/bin/perl use strict; use XML::Simple 'XMLin'; use Data::Dumper; my

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

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

这是我正在解析T124.XML的XML文件(我将其作为一个大文件进行了摘要):

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

#!/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";
    }
}
Temperature
675.0 
613.0
612.0
614.0
613.0 

等等。

这里有一个从XML中提取温度数据的简单脚本。我在这里包含XML源代码,因为您提供的源代码似乎缺少一些
s。我曾经解析数据

#!/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;
}

不要按原样使用。而是使用XPath访问深层节点。您的源文件是否缺少温度值的引号,或者这是粘贴中的问题?嗨,Jim,源文件XML位于顶部。我显示了文件的上下文……非常感谢“我警告了外星人”,我用“打印”替换了say并添加了“/n”“获得同样的结果。你救了我所有的痛苦。也就是说,我正在尝试使用in和out文件编写此脚本。我想将提取的XML数据推送到CSV文件中,但不确定如何使用“twig”执行此操作。很抱歉,我又不清楚了。打印输出文件不是问题所在(尽管我将使用您提供的内容),它的in-file(XML)parsefile语法我不知道$t->parsefile(“T123.xml”)我认为是正确的,但是…当您执行
$t->parsefile(…)
时会发生什么?您发布的XML无效,因此我必须先更正它,然后才能进行任何解析。你可能也得做同样的事情。注意:在docs for XML::Twig中:“如果发生解析错误,就会抛出一个die调用。”嗨,我警告了alien,我将完整的XML粘贴到脚本中,不得不减少下面第一行的内容,效果很好。但是,当我尝试解析文件时,会出现以下错误:“您似乎对文件名(*XML::Parser::FILE)使用了解析方法”,谢谢“我警告了外星人”。你是对的,XML文件是问题所在,所以我将调整脚本来清理XML文件,然后我可以解析它-难以置信。再次感谢,仅供参考,我正在使用parsefile()
#!/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