XML::DOM
モジュールを使用してハッシュするために単純なXMLドキュメントを解析したいと思います。
<?xml version ="1.0"?>
<Select>
<book>
<prop Name = "prop1" Title = "title1" />
<prop Name = "prop2" Title = "title2" />
</book>
<fruit>
<prop Name = "prop3" Title = "title3" />
<prop Name = "prop4" Title = "title4" />
</fruit>
</Select>
期待される出力は-
$VAR1 = {
Select => {
book => {
prop => [
{ Name => "prop1", Title => "title1" },
{ Name => "prop2", Title => "title2" },
],
},
fruit => {
prop => [
{ Name => "prop3", Title => "title3" },
{ Name => "prop4", Title => "title4" },
],
},
},
}
私は次のようなコードを書きました:
use strict;
use XML::DOM;
use Data::Dumper;
my @stack;
my %hash;
push @stack,\%hash;
my $parser = new XML::DOM::Parser;
my $doc = $parser -> parsefile('demo.xml');
my $root = $doc->getDocumentElement();
my $rootnode = $root->getTagName;
################################################################
foreach my $node ($doc->getElementsByTagName($rootnode)){
push @stack,$stack[$#stack]->{$rootnode};
my @childnode = $node->getChildNodes();
foreach my $child(@childnode){
if($child->isElementNode){
my $childname = $child->getNodeName();
pop(@stack);
push @stack,$stack[$#stack]->{$rootnode} = {$childname,{}};
my @childnodes2 = $child->getChildNodes();
foreach my $subchild(@childnodes2){
if($subchild->isElementNode){
my $subchildname = $subchild->getNodeName();
my $name = $subchild->getAttributes->getNamedItem('Name')->getNodeValue;
my $title = $subchild->getAttributes->getNamedItem('Title')->getNodeValue;
pop(@stack);
push @stack,$stack[$#stack]->{$rootnode}->{$child->getNodeName()} = {$subchildname,{}}; #{} contains $name or $title
}
}
}
}
}
print Dumper(\%hash);
配列を正しくプッシュしてポップすることができないと思います。XML::Simple
また、再帰を使いたくありません。
Perlでこれを行うにはどうすればよいですか?