XMLから行列を作成し、テキストに出力しようとしています。

XMLには複数人がそれぞれ好む色が書かれています。
それをもとに、以下のような行列を作りたいと考えています。

Perlのプログラムのコードを教えてください。よろしくおねがいします。

--------XML-------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<person_list>
<person id="1001">
<keywords><keyword>赤</keyword><keyword>青</keyword></keywords>
</person>
<person id="1002">
<keywords><keyword>赤</keyword><keyword>黄</keyword></keywords>
</person>
<person id="1003">
<keywords><keyword>黄</keyword></keywords>
</person>
</person_list>
------------------------------------------------------------------

--------テキスト-------------
1001 1002 1003
赤 1 1 0
青 1 0 0
黄 0 1 1
-----------------------------

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2010/08/01 15:15:43
  • 終了:2010/08/03 23:22:39

ベストアンサー

id:meeker-bot No.1

ゆう回答回数16ベストアンサー獲得回数62010/08/02 23:10:11

ポイント60pt

XML::XPathというモジュールを使っています。

インストールしていなければ、Perl Package Managerなどでインストールしてください。

ロジックとしては、

まず、人と色の組み合わせの2次元連想配列を作っておきます。

そのあと、色と人の二次元ループの中で、

その人と色の組み合わせのキーが存在する場合は、1を出力しています。

#!/usr/bin/perl
use LWP::Simple;
use XML::XPath;

#入力ファイルの定義
my $file = 'data.xml';

#出力ファイルの定義
open(OUT, ">data_out.txt");

#XPathオブジェクトを作成
my $xp = XML::XPath -> new( filename => $file );

#連想配列の定義
my %table = ();
my %color = ();
my %person = ();

#人の分ループする
foreach my $node ( $xp -> find('/person_list/person') -> get_nodelist ){
	my $id = $node -> findvalue('@id');
	
	#人のIDを保存する
	$person{$id} = 1;
	
	#この人の好む色の分ループする
	foreach my $nodeInner ( $node -> find('keywords/keyword') -> get_nodelist ){
		#色を取得する
		my $keyword = $nodeInner -> string_value;
		
		#テーブルを作成する
		$table{$id}{$keyword} = 1;
		
		#色を保存する
		$color{$keyword} = 1;
	}
}

#ヘッダを表示
foreach(sort keys %person){
	print OUT $_ . " ";
}
print OUT "\n";

#本体部を表示
foreach(sort keys %color){
	print OUT $_;
	my $key = $_;
	
	foreach(sort keys %person){
		if(exists($table{$_}{$key})){
			print OUT " 1";
		}
		else{
			print OUT " 0";
		}
	}
	print OUT "\n";
}
id:riyoooh

ありがとうございました。

2010/08/03 23:21:51
  • id:darkwood
     色の隣の[1 1 0, 1 0 0, 0 1 1]はXMLに無いけど、どうするのかとか、環境くらいは書かないと回答は付かないかと。
  • id:riyoooh
    行列は、それぞれの人が色を要素として持っていれば1、持っていなければ0を表示しています。
    例えば1001の人は、赤と青を持っているので、その部分が1、黄が0となっています。
    人の数、色の種類はそれぞれ1000以上あるため、手動で色を指定して有無を判断することが困難となっています。

    環境は、windows xp、active perlです。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません