使用Perl读取XML文件
问题描述:
我有一个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”作为输出。
答
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]')")});
这将列出所有值符合您的条件
答
使用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
使用的XML解析库样['XML :: LibXML'](https://metacpan.org/pod/ XML :: LibXML)或['XML :: Twig'](https://metacpan.org/pod/XML::Twig) – Zaid 2014-08-27 09:05:22
...或['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