プロが教える店舗&オフィスのセキュリティ対策術

XML::DOMで効率的なソートの方法はどんなものがありますでしょうか。

一応動くものは作れたのですが、効率的とは言い難く、しかも
ソート項目が一意のデータでないといけないという欠点があります。

###############################################
use XML::DOM::XPath;

my $xml = <<EOM;
<?xml version="1.0" encoding="UTF-8" ?>
<list>
<item id="10">Apple</item>
<item id="5">Orange</item>
<item id="20">Melon</item>
</list>
EOM

my $parser = XML::DOM::Parser->new();
my $doc = $parser->parse( $xml );

## <item>タグの一覧を作成
my @list = $doc->findnodes('/list/item');

## <item>タグ id属性一覧を作成
my @idlist = map{ $_->getAttribute("id") } @list;

## id属性順にソート
foreach my $id ( sort{ $a<=>$b } @idlist ){

## id属性値を指定してノードリストを取得
my @item = $doc->findnodes('/list/item[@id='.$id.']');

## idは一意なのでリストの先頭で固定
print $item[0]->getAttribute('id')."\n";
print $item[0]->getFirstChild->getNodeValue."\n";
}
###############################################


ハッシュなら
sort{ $hoe{$b} <=> $hoe{$a} } keys %hoe
といった方法があるのですが、XML::DOMの場合は同じようにいきません。

良い方法がありましたらお願いします。

A 回答 (1件)

use XML::DOM::XPath;



my $xml = <<EOM;
<?xml version="1.0" encoding="UTF-8" ?>
<list>
<item id="10">Apple</item>
<item id="5">Orange</item>
<item id="20">Melon</item>
</list>
EOM

my $parser = XML::DOM::Parser->new();
my $doc = $parser->parse( $xml );

## <item>タグの一覧を作成
my @list = $doc->findnodes('/list/item');

foreach my $node ( sort { $a->getAttribute('id') <=> $b->getAttribute('id') } @list){
print $node->getAttribute('id')."\n";
print $node->getFirstChild->getNodeValue."\n";
}
    • good
    • 0
この回答へのお礼

あ!

そうか…それぞれのオブジェクトがもう別物なのだから
$a、$bをオブジェクトに置き換えればそのままですね。

ものすごく単純な見落としをしていました。
ありがとうございます!!

お礼日時:2006/01/17 11:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!