使用perl读取XML文件

时间:2014-08-27 08:57:00

标签: xml perl

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

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

它更像是一个检索值的查询.eg:&#34; perl myscript.pl Linux DEV&#34;应该给我&#34; 2GB&#34;作为输出。

2 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:0)

如果您只需要获取XML标记内的值,请使用简单的正则表达式匹配:

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

如果要处理整个XML结构(就像您应该那样),请使用XML模块,如XML :: Parser

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]')")});

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