Perlを用いて、XMLファイルの中のキーワードの個数を数えるプログラムを組もうと思っています。

次のような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>

具体的なプログラムのコードを教えてください。よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2010/05/28 00:06:24
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Committeeman No.1

回答回数153ベストアンサー獲得回数19

ポイント60pt
# 読取
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);

出力で改行コードをつけるかどうかは好みで・・・

id:riyoooh

ありがとうございます。

2010/05/28 00:05:43

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません