需要使用perl从xml文件中获取值

时间:2015-04-10 07:02:50

标签: xml perl parsing

我有以下xml文件strings.xml。我需要从{

}获取值1.0.0.44

<string name="app_version">1.0.0.44</string>

我怎样才能使用XML :: Simple?

<?xml version="1.0" encoding="utf-8"?>
 <resources>
  <string name="drawer_item_text">Drawer Item</string>
  string name="drawer_image_desc">Icon for the Navigation drawer item</string>
  <string name="app_version">1.0.0.44</string>
 <string name="module_version_no">1.0.1.20</string>

我没有在使用Perl进行XML解析方面做太多工作?指针将是一个很好的帮助。

3 个答案:

答案 0 :(得分:1)

使用XML :: LibXML;

use v5.16;
use XML::LibXML;
my $dom = XML::LibXML->load_xml(IO => *DATA{IO});
say $dom->findvalue('//string[@name="app_version"]');
__DATA__
<resources>
  <string name="drawer_item_text">Drawer Item</string>
  <string name="drawer_image_desc">Icon for the Navigation drawer item</string>
  <string name="app_version">1.0.0.44</string>
  <string name="module_version_no">1.0.1.20</string>
</resources>

输出1.0.0.44

答案 1 :(得分:1)

您可以使用XML::Twig

use warnings;
use strict;

use XML::Twig;

my $twig = XML::Twig->new();
$twig->parsefile('test.xml');
print $twig->findvalue('string[@name="app_version"]');

输出是:

1.0.0.44

答案 2 :(得分:0)

不要使用XML::Simple

  

不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口

我会建议XML::Twig。 (作为已发布的XML::LibXML解决方案的替代方案):

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

sub process_string {
    my ( $twig, $string ) = @_;
    if ( $string->att('name') eq 'app_version' ) {
        print $string ->text, "\n";
    }
}

my $twig = XML::Twig->new(
    'pretty_print'  => 'indented',
    'twig_handlers' => { 'string' => \&process_string },

);

$twig->parse( \*DATA );


__DATA__
<?xml version="1.0" encoding="utf-8"?>
 <resources>
  <string name="drawer_item_text">Drawer Item</string>
  <string name="drawer_image_desc">Icon for the Navigation drawer item</string>
  <string name="app_version">1.0.0.44</string>
   <string name="module_version_no">1.0.1.20</string>
 </resources>