1

我是 Perl 语言的新手。我有一个类似的 XML,

<xml>
   <date>
       <date1>2012-10-22</date1>
       <date2>2012-10-23</date2>
   </date>
</xml>

我想解析这个 XML 文件并将其存储在数组中。如何使用 perl 脚本执行此操作?

4

4 回答 4

3
Use XML::Simple - Easy API to maintain XML (esp config files) or 
see XML::Twig - A perl module for processing huge XML documents in tree mode.

像这样的例子:

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my $xml = q~<xml>
   <date>
       <date1>2012-10-22</date1>
       <date2>2012-10-23</date2>
   </date>
</xml>~;

print $xml,$/;

my $data = XMLin($xml);

print Dumper( $data );

my @dates;
foreach my $attributes (keys %{$data->{date}}){
  push(@dates, $data->{date}{$attributes})
}

print Dumper(\@dates);

输出:

$VAR1 = [
          '2012-10-23',
          '2012-10-22'
        ];
于 2013-06-07T11:13:00.650 回答
2

使用XML::XSH2,一个围绕XML::LibXML的包装器:

#!/usr/bin/perl
use warnings;
use strict;

use XML::XSH2;

xsh << '__XSH__';
  open 2.xml ;
  for $t in /xml/date/* { 
      my $s = string($t) ;
      perl { push @l, $s }
  }
__XSH__

no warnings qw(once);
print join(' ', @XML::XSH2::Map::l), ".\n";
于 2013-06-07T11:44:05.210 回答
2

这是XML::LibXML的一种方法

#!/usr/bin/env perl
use strict;
use warnings;
use XML::LibXML;

my $doc = XML::LibXML->load_xml(location => 'data.xml');
my @nodes = $doc->findnodes('/xml/date/*');
my @dates = map { $_->textContent } @nodes;
于 2013-06-07T13:05:55.437 回答
-2

如果您不能/不想使用任何 CPAN 模块:

my @hits= $xml=~/<date\d+>(.+?)<\/date\d+>/

这应该为您提供@hits数组中的所有日期。

如果 XML 不像您的示例那么简单,建议使用 XML 解析器,这XML::Parser就是其中之一。

于 2013-06-07T11:08:05.217 回答