2014-08-27 94 views
0

我有一个XML文件,看起来像这样,我希望检索RAM的值。我很新的perl。任何帮助,将不胜感激。使用Perl读取XML文件

<hardware> 
<computer OS="Linux" ENV="DEV">2GB</computer> 
<computer OS="windows" ENV="QA">3GB</computer> 
</hardware> 

它更像是一个查询检索value.eg:“perl的myscript.pl Linux开发”应该给我“2GB”作为输出。

+1

使用的XML解析库样['XML :: LibXML'](https://metacpan.org/pod/ XML :: LibXML)或['XML :: Twig'](https://metacpan.org/pod/XML::Twig) – Zaid 2014-08-27 09:05:22

+1

...或['XML :: Rabbit'](https:// metacpan。 org/pod/XML :: Rabbit)(我已经使用过它并且非常喜欢它),或者[Task :: Kensho中列出的模块之一](https://metacpan.org/pod/Task :: Kensho#Task :: Kensho :: XML:-XML-Development)或[某些其他模块](https://metacpan.org/search?q=xml)。 – Biffen 2014-08-27 09:19:55

回答

0

F你只需要获得XML标签内的值,可以使用一个简单的正则表达式匹配:如果你要处理的整个XML结构(如你应该做的)

foreach (split(/\n/,$xmltext)) 
{ 
    print "$1\n" if /<computer.*>(.*)<\/computer>/; 
} 

,使用XML模块像XML解析器::

MOD:

对于查询般的搜索,你必须使用一个XML解析器,例如:

#!/usr/bin/perl -w 

use strict; 
use warnings; 
use XML::Bare; 

my $parser = new XML::Bare(file => "ram.xml"); 
print $_->{value}."\n" foreach (@{$parser->find_by_perl($parser->parse()->{hardware}->{computer}, "(-OS eq '$ARGV[0]') && (-ENV eq '$ARGV[1]')")}); 

这将列出所有值符合您的条件

+0

它更像是一个查询来检索value.eg:“perl myscript.pl Linux DEV”应该给我“2GB”作为输出。 – Curious 2014-08-27 09:15:55

+0

检查更新的答案 – glezmen 2014-08-27 09:56:24

+0

我怎么可以给XML文件作为输入来搜索,而不是 我的$ XML = << END <计算机OS = “Linux的” ENV = “DEV”> 2GB <计算机OS = “windows”ENV =“QA”> 3GB END ; – Curious 2014-08-27 10:00:58

0

使用XML::LibXML

use strict; 
use warnings; 
use feature qw(say); 

use XML::LibXML; 

die "Usage: $0 <OS> <ENV>\n" if @ARGV != 2; 

my ($os, $env) = @ARGV; 

my $xml = XML::LibXML->load_xml(IO => \*DATA); 

say $xml->findvalue(qq{//computer[\@OS = "$os"][\@ENV = "$env"]}) 

__DATA__ 
<hardware> 
<computer OS="Linux" ENV="DEV">2GB</computer> 
<computer OS="windows" ENV="QA">3GB</computer> 
</hardware> 

或者使用XML::Twig

use strict; 
use warnings; 
use feature qw(say); 

use XML::Twig; 

die "Usage: $0 <OS> <ENV>\n" if @ARGV != 2; 

my ($os, $env) = @ARGV; 

my $t = XML::Twig->new( 
    twig_handlers => { 
     qq{//computer[\@OS="$os" and \@ENV="$env"]} => sub { say $_->text() }, 
    }, 
); 
$t->parse(do {local $/; <DATA>}); 

__DATA__ 
<hardware> 
<computer OS="Linux" ENV="DEV">2GB</computer> 
<computer OS="windows" ENV="QA">3GB</computer> 
</hardware> 

输出:

$ perl script.pl Linux DEV 
2GB