2014-08-27 104 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