人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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>
------------------------------------------------------------------

--------テキスト-------------
100110021003
赤 1 1 0
青 1 0 0
黄 0 1 1
-----------------------------

●質問者: riyoooh
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Perl XML コード テキスト プログラム
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● ゆう
●60ポイント ベストアンサー

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";
}
◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ