XML::LibXML::Simpleを使ってみる

XMLファイルを読み込んで、マップ形式で表示してみる。
ソースコードは以下の通り

use strict;
use warnings;
use utf8;
use IO::File;
use XML::LibXML::Simple;
use Data::Dumper;

binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';

# Input Check
if (@ARGV != 1) {
  print STDERR "Please input XML file name.\n";
  exit 1;
}

my $xmlin_name = $ARGV[0];

# File Check
unless (-f $xmlin_name) {
  print STDERR "$xmlin_name is not found.\n";
  exit 1;
}

# Input XML
my $fh = IO::File->new($xmlin_name, 'r');
my $xml_parser = XML::LibXML::Simple->new();
my $xml = $xml_parser->XMLin($fh, KeepRoot => 1, ForceArray => 1, ForceContent => 1);

$fh->close;

print Dumper($xml);

my $persons = $xml->{'addressBook'}[0]{'person'};

# Output XML Data
for (my $cnt = 0; $cnt < @$persons; $cnt++) {
  print '(' . ($cnt + 1) . ')' . "\n";
  foreach my $key (sort keys %{$persons->[$cnt]}) {
    print "\t" . $key . ' : ' . $persons->[$cnt]{$key}[0]{'content'} . "\n";
  }
}

exit 0;

XMLファイル(sample.xml)

<?xml version="1.0" encoding="UTF-8"?>
<addressBook>
  <person>
    <name>山田 太郎</name>
    <email>taro.yamada@xxx.com</email>
    <address>東京</address>
  </person>
  <person>
    <name>田中 次郎</name>
    <email>jiro.tanaka@xxx.com</email>
    <address>大阪</address>
  </person>
  <person>
    <name>阿部 三郎</name>
    <email>saburo.abe@xxx.com</email>
    <address>名古屋</address>
  </person>
</addressBook>

実行結果(念のため、読み込んだ直後のデータをDumpする。)

$ perl input_xml_simple.pl sample.xml
$VAR1 = {
          'addressBook' => [
                           {
                             'person' => [
                                         {
                                           'email' => [
                                                      {
                                                        'content' => 'taro.yamada@xxx.com'
                                                      }
                                                    ],
                                           'name' => [
                                                     {
                                                       'content' => "\x{5c71}\x{7530} \x{592a}\x{90ce}"
                                                     }
                                                   ],
                                           'address' => [
                                                        {
                                                          'content' => "\x{6771}\x{4eac}"
                                                        }
                                                      ]
                                         },
                                         {
                                           'email' => [
                                                      {
                                                        'content' => 'jiro.tanaka@xxx.com'
                                                      }
                                                    ],
                                           'name' => [
                                                     {
                                                       'content' => "\x{7530}\x{4e2d} \x{6b21}\x{90ce}"
                                                     }
                                                   ],
                                           'address' => [
                                                        {
                                                          'content' => "\x{5927}\x{962a}"
                                                        }
                                                      ]
                                         },
                                         {
                                           'email' => [
                                                      {
                                                        'content' => 'saburo.abe@xxx.com'
                                                      }
                                                    ],
                                           'name' => [
                                                     {
                                                       'content' => "\x{963f}\x{90e8} \x{4e09}\x{90ce}"
                                                     }
                                                   ],
                                           'address' => [
                                                        {
                                                          'content' => "\x{540d}\x{53e4}\x{5c4b}"
                                                        }
                                                      ]
                                         }
                                       ]
                           }
                         ]
        };
(1)
	address : 東京
	email : taro.yamada@xxx.com
	name : 山田 太郎
(2)
	address : 大阪
	email : jiro.tanaka@xxx.com
	name : 田中 次郎
(3)
	address : 名古屋
	email : saburo.abe@xxx.com
	name : 阿部 三郎
$

DOMではなくマップとリストで管理できるのは楽かも知れない。
personタグに囲まれた要素(name,email,address)の順番が保持できないのが難点か。