次のようなXMLの中の<keyword>のタグに囲まれた文字列を数えるプログラムです。
<?xml version="1.0" encoding="UTF-8"?>
<grant_award_list>
<grant_award id="1001">
<title>タイトル1</title>
<keywords><keyword>A</keyword><keyword>B</keyword></keywords>
</grant_award>
<grant_award id="1002">
<title>タイトル2</title>
<keywords><keyword>B</keyword></keywords>
</grant_award>
</grant_award_list>
このようなときに、次のようにキーワードとその出現回数が記載されたXMLファイルにしたいと考えています。
<?xml version="1.0" encoding="UTF-8"?>
<keywords>
<keyword>A</keyword>
<count>1</count>
</keywords>
<keywords>
<keyword>B</keyword>
<count>2</count>
</keywords>
具体的なプログラムのコードを教えてください。よろしくお願いします。
# 読取 use XML::Simple; my $readXML = XML::Simple -> new -> XMLin('input.xml', ForceArray=>['keyword']); # 抽出 my @data; foreach my $key (keys %{$readXML->{'grant_award'}}) { $ref = $$readXML{'grant_award'}{$key}{'keywords'}; foreach $values (@$ref{'keyword'}) { push(@data, @$values); } } # 検数 my %count; foreach (@data) { $count{$_}++; } # 出力 open(OUT, ">output.xml"); print OUT '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; while(($key, $value) = each(%count)) { print OUT '<keywords>' . "\n"; print OUT '<keyword>' . $key . '</keyword>' . "\n"; print OUT '<count>' . $value . '</count>' . "\n"; print OUT '</keywords>' . "\n"; } close(OUT);
出力で改行コードをつけるかどうかは好みで・・・
ありがとうございます。