--------------------------
<name id="1">
<keywords>
<keyword>a</keyword>
<keyword>b</keyword>
</keywords>
</name>
<name id="2">
<keywords>
<keyword>c</keyword>
</keywords>
</name>
<name id="3">
<keywords>
<keyword>d</keyword>
</keywords>
</name>
・
・
・
------------------------------
このようなxmlがあったとき、name id 1と2と3を選んだら、
以下のようにキーワードの組み合わせを習得し、
テキストに書き込むプログラムを教えてください。
お願いします。
a-b
a-c
a-d
b-c
b-d
c-d
XML::Simpleを使った! コメントを全て外せばデバッグモード!!
#use Data::Dumper; use XML::Simple; @selectID = ('1', '2'); $readXML = XML::Simple -> new -> XMLin('a.xml', ContentKey => '-keywords', forcearray => 'keyword'); #warn Dumper($readXML); @data = (); foreach $id (@selectID) { foreach $values ($$readXML{'name'}{$id}{'keyword'}) { push(@data, @$values); } } #warn Dumper(@data); $count = $#data; open(OUT, ">a.txt"); for($i = 0; $i <= $count; $i++){ for($k = $i + 1; $k <= $count; $k++){ print OUT @data[$i] . '-' . @data[$k] . "\n"; } } close(OUT);
<?xml version='1.0'?> <root> <name id="1"> <keywords> <keyword>a</keyword> <keyword>b</keyword> </keywords> </name> <name id="2"> <keywords> <keyword>c</keyword> </keywords> </name> <name id="3"> <keywords> <keyword>d</keyword> </keywords> </name> </root>
XML::Simpleを使った! コメントを全て外せばデバッグモード!!
#use Data::Dumper; use XML::Simple; @selectID = ('1', '2'); $readXML = XML::Simple -> new -> XMLin('a.xml', ContentKey => '-keywords', forcearray => 'keyword'); #warn Dumper($readXML); @data = (); foreach $id (@selectID) { foreach $values ($$readXML{'name'}{$id}{'keyword'}) { push(@data, @$values); } } #warn Dumper(@data); $count = $#data; open(OUT, ">a.txt"); for($i = 0; $i <= $count; $i++){ for($k = $i + 1; $k <= $count; $k++){ print OUT @data[$i] . '-' . @data[$k] . "\n"; } } close(OUT);
<?xml version='1.0'?> <root> <name id="1"> <keywords> <keyword>a</keyword> <keyword>b</keyword> </keywords> </name> <name id="2"> <keywords> <keyword>c</keyword> </keywords> </name> <name id="3"> <keywords> <keyword>d</keyword> </keywords> </name> </root>
早速のお返事ありがとうございます。
本当に助かりました。参考にさせていただきます。
ところが少し内容がことなるxmlに適用したところ、次のようなエラーが出てしまいました。
No such pseudo-hash field "40037221" at xml01.pl line9.
ことなるxmlというのは
<name id="1"> の部分が、
<researcher id="40037221" permalink="http://・・・">
のようになっています。
そこでいただいたプログラムの3行目のselectIDを40037221のようにし、
9行目のnameの部分をresearcherとしたところ上記のエラーが発生してしまいました。
このエラーの解決方法を教えていただけないでしょうか。
誰も答えないので一応書いてみました。
ロジック間違ってたらすみません。
もっと良いやり方が絶対にありそうです。
use strict;
$| = 1;
#指定の番号を入れる
my @number = (1,2,3);
my @xml = <DATA>;
my @array; my $flag;
for my $number (@number){
for (@xml) {
if(m/<name id="${number}">/ || $flag){
if( my ($al) = ($_ =~ m!<keyword>(.*?)<\/keyword>!sig) ){
push(@array , $al );
}
$flag = 1;
}
if(m/<\/name>/){
$flag = 0;
}
}
}
for(;;){
for (@array) {
my $al1 = shift @array;
for my $al2 (@array){
open(F,">>text.txt");
print F "${al1}-${al2}\n";
print "${al1}-${al2}\n";
close(F);
}
}
unless(@array){last;};
}
__DATA__
<name id="1">
<keywords>
<keyword>a</keyword>
<keyword>b</keyword>
</keywords>
</name>
<name id="2">
<keywords>
<keyword>c</keyword>
</keywords>
</name>
<name id="3">
<keywords>
<keyword>d</keyword>
</keywords>
</name>
お返事おそくなりました。
早速試したところうまく動きました。
ありがとうございます。
XMLファイルの構造が変わったのでプログラムを作り直しました! XMLに対して汎用的な対処法があれば私も知りたいです!!
#use Data::Dumper; use XML::Simple; @selectID = ('40037221', '40037222'); $readXML = XML::Simple -> new -> XMLin('a.xml', forcearray => 'keyword'); #warn Dumper($readXML); @data = (); foreach $id (@selectID) { $ref = $$readXML{'researcher'}{$id}{'keywords'}[0]; foreach $values (@$ref{'keyword'}) { push(@data, @$values); } } #warn Dumper(@data); $count = $#data; open(OUT, ">a.txt"); for($i = 0; $i <= $count; $i++){ for($k = $i + 1; $k <= $count; $k++){ print OUT @data[$i] . '-' . @data[$k] . "\n"; } } close(OUT);
<?xml version='1.0'?> <root> <researcher id="40037221" permalink="http://example.jp/40037221"> <keywords> <keyword>a</keyword> <keyword>b</keyword> </keywords> </researcher> <researcher id="40037222" permalink="http://example.jp/40037222"> <keywords> <keyword>c</keyword> </keywords> </researcher> <researcher id="40037223" permalink="http://example.jp/40037223"> <keywords> <keyword>d</keyword> </keywords> </researcher> </root>
ありがとうございます。
xmlの形式が変わるごとに書き換えるのはめんどうですね。
早速のお返事ありがとうございます。
本当に助かりました。参考にさせていただきます。
ところが少し内容がことなるxmlに適用したところ、次のようなエラーが出てしまいました。
No such pseudo-hash field "40037221" at xml01.pl line9.
ことなるxmlというのは
<name id="1"> の部分が、
<researcher id="40037221" permalink="http://・・・">
のようになっています。
そこでいただいたプログラムの3行目のselectIDを40037221のようにし、
9行目のnameの部分をresearcherとしたところ上記のエラーが発生してしまいました。
このエラーの解決方法を教えていただけないでしょうか。