perlのソートの方法について質問です。


XMLにおいて、<count>タグ内の値の大きい順に並び替えたいと考えています。

<?xml version="1.0" encoding="UTF-8"?>
<keywords>
<keyword>赤</keyword>
<count>2</count>
</keywords>
<keywords>
<keyword>黄</keyword>
<count>1</count>
</keywords>
<keywords>
<keyword>青</keyword>
<count>3</count>
</keywords>

-----結果---------
<?xml version="1.0" encoding="UTF-8"?>
<keywords>
<keyword>青</keyword>
<count>3</count>
</keywords>
<keywords>
<keyword>赤</keyword>
<count>2</count>
</keywords>
<keywords>
<keyword>黄</keyword>
<count>1</count>
</keywords>


よろしくお願いします。

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

ベストアンサー

id:koriki-kozou No.1

回答回数480ベストアンサー獲得回数79

ポイント70pt
use XML::Simple;
my $readXML = XML::Simple -> new -> XMLin('input.xml', ForceArray=>['keyword','count']);
@{$readXML->{'keywords'}} = sort { $b->{count}[0] cmp $a->{count}[0] } @{$readXML->{'keywords'}};
print XMLout($readXML);

元データには下記のようにルート要素(仮にrootと名づけた)が存在しなければ正しく認識してくれないので注意

<?xml version="1.0" encoding="UTF-8"?>
<root>
<keywords>
<keyword></keyword>
<count>2</count>
</keywords>
<keywords>
<keyword></keyword>
<count>1</count>
</keywords>
<keywords>
<keyword></keyword>
<count>3</count>
</keywords>
</root>
id:riyoooh

ありがとうございます。

上記XMLデータを適用してみたところ、

「not well-formed (invalid token) at line 4, column 9, byte 66 at C:/usr/local/lib/XML/Parser.pm line 187」

というエラーが発生してしまいました。

パーサー中にエラーがあるということなのでしょうか。

2010/05/28 09:39:53

その他の回答3件)

id:koriki-kozou No.1

回答回数480ベストアンサー獲得回数79ここでベストアンサー

ポイント70pt
use XML::Simple;
my $readXML = XML::Simple -> new -> XMLin('input.xml', ForceArray=>['keyword','count']);
@{$readXML->{'keywords'}} = sort { $b->{count}[0] cmp $a->{count}[0] } @{$readXML->{'keywords'}};
print XMLout($readXML);

元データには下記のようにルート要素(仮にrootと名づけた)が存在しなければ正しく認識してくれないので注意

<?xml version="1.0" encoding="UTF-8"?>
<root>
<keywords>
<keyword></keyword>
<count>2</count>
</keywords>
<keywords>
<keyword></keyword>
<count>1</count>
</keywords>
<keywords>
<keyword></keyword>
<count>3</count>
</keywords>
</root>
id:riyoooh

ありがとうございます。

上記XMLデータを適用してみたところ、

「not well-formed (invalid token) at line 4, column 9, byte 66 at C:/usr/local/lib/XML/Parser.pm line 187」

というエラーが発生してしまいました。

パーサー中にエラーがあるということなのでしょうか。

2010/05/28 09:39:53
id:edWard No.2

回答回数85ベストアンサー獲得回数7

ポイント20pt

> パーサー中にエラーがあるということなのでしょうか。

XMLファイルをUTF-8で保存しましたか?

id:riyoooh

はい。

UTF-8で保存していますが、同じエラーになります。

2010/05/29 11:25:47
id:wwwww1 No.3

回答回数63ベストアンサー獲得回数0

赤 黄色 青

id:wwwww1 No.4

回答回数63ベストアンサー獲得回数0

どうゆう事?

  • id:t-wata
    前の質問にあったコードの、
    while(($key, $value) = each(%count)) {
    ....
    }
    を、
    foreach my $key (sort {$count{$b} cmp $count{$a}} keys %count){
    print OUT '<keywords>' . "\n";
    print OUT '<keyword>' . $key . '</keyword>' . "\n";
    print OUT '<count>' . $count{$key} . '</count>' . "\n";
    print OUT '</keywords>' . "\n";
    }
    にすればいいんじゃないの?

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

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

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

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