TOP XML & CGI 目次

XMLでデータベース
編集データの書き込み(プログラム青字部分)
これで基本のシステムはできた(と思う)。テスト用の要らないプログラムも入ってますが、全ソースをいかに掲載します。エディタではちゃんと段下げができているのですが、コピーすると反映されていませんのであしからず。
test09.cgi
#!/usr/bin/perl

print "Content-type: text/html\n\n";

#要素名の定義
$element_root = "新聞雑誌記事";
$element = "記事";

#===================メイン=====================

#フォームから送られてきた内容をデコードする
&decode_f;
# &datacheck_ante;

if($FORM{'action'} eq "edit"){

#フォームデータを統合する
$data = "タイトル\=\"" . $FORM{'title'} . "\" ";
$data = $data . "サブタイトル\=\"" . $FORM{'subtitle'} . "\" ";
$data = $data . "文献\=\"" . $FORM{'bunken'} . "\" ";
$data = $data . "人物\=\"" . $FORM{'jinbutsu'} . "\" ";
$data = $data . "年月日\=\"" . $FORM{'nengappi'} . "\" ";
$data = $data . "連続\=\"" . $FORM{'renzoku'} . "\" ";
$data = $data . "画像\=\"" . $FORM{'gazou'} . "\" ";
$data = $data . "横サイズ\=\"" . $FORM{'yoko'} . "\" ";
$data = $data . "縦サイズ\=\"" . $FORM{'tate'} . "\" ";
$data = $data . "リンク名\=\"" . $FORM{'linkmei'} . "\" ";
$data = $data . "リンク\=\"" . $FORM{'link'} . "\" ";
$data = $data . "コメント\=\"" . $FORM{'comment'} . "\"";

$FORM{'text'} =~ s/\n/&lt\;br\/&gt\;/g; #テキストの改行を無効にする
$data = "\<".$element." ".$data."\>".$FORM{'text'}."\<\/".$element."\>";
#ファイルデータを配列に入れる
&data;

#編集データの該当配列を置き換える
$data[$FORM{'n'}] = $data;

$data[1] = "\<".$element_root."\>".$data[1];

$n = 0;
foreach(@data){
$data[$n] = $data[$n]."\n"; #1データの終わりに改行追加
$n++;
}
$n = $n-1;
$data[$n] = $data[$n]."\<\/".$element_root."\>"."\n";

#書き込みをログファイルに書き加える
open(OUT,">dtb.xml");
print OUT @data,"\n";
close(OUT);


}


#ファイルデータを配列に入れる
&data;
#フォームから送られてきた記事番号を$nに伝達する
$n = $FORM{'n'};
#要素属性を配列に入れる/テキストの抽出
&zokusei;
#テキストの改行を有効にする
$text[$n] =~ s/&lt\;br\/&gt\;/\n/g;
#入力/編集フォーム
&edit;
exit;

#ゴミ箱
$data[$n] =~ s/&lt\;/</g; #htmlタグを回復する
$data[$n] =~ s/&gt\;/>/g; #htmlタグを回復する


# foreach(@data){
# print "\$data\[$n\]\="."$data[$n]<BR>\n";
# $n++;
# }


#=================サブルーチン=================

#データを配列に入れる
sub data{
open (IN,"dtb.xml");
@data=<IN>;
close(IN);

$n=0;
foreach(@data){
$data[$n] =~ s/\<$element_root\>//g; #ルート要素始めを除く
$data[$n] =~ s/\<\/$element_root\>//g; #ルート要素終わりを除く
$data[$n] =~ s/\n//g; #改行コードを除く
$n++;
}
}

#要素属性を配列に入れる/テキストの抽出
sub zokusei{
@zokusei = split(/" /,$data[$n]); #属性を各配列に納める
$zokusei[0] =~ s/&lt\;$element //g; #タイトルから<$element を取り除く
$zokusei[11] =~ s/&lt\;\/$element&gt\;//g; #コメントから</$element>を取り除く
$l = index($zokusei[11],"\"\>");
# print $zokusei[11];
# print "★".$l;
# exit;

$text[$n] = substr($zokusei[11],$l+2); #テキストを取り出す
$zokusei[11] = substr($zokusei[11],0,$l); #属性の値を取り出す
$m = 0;
foreach(@zokusei){
$zokusei[$m] =~ s/"//g; #最後に残った " を取り除く
$l=index($zokusei[$m],"\="); #属性名を除く
$zokusei[$m]=substr($zokusei[$m],$l+1,length($zokusei[$m])-$l);
$m++;
}
}

#入力/編集フォーム
sub edit {
print <<"EOL";
<HTML>
<HEAD>
<META name="GENERATOR" content="IBM WebSphere Homepage Builder V6.0.1 for Windows">
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>$element_root編集フォーム</TITLE>
</HEAD>
<BODY bgcolor="#bbccbb">
<CENTER><B><FONT size="+1">$element_root 編集フォーム<BR>
<BR>
</FONT></B>
<FORM ACTION="test09.cgi" METHOD="POST">
<INPUT TYPE="hidden" NAME="action" VALUE="edit">
<INPUT TYPE="hidden" NAME="n" VALUE=$n>
<TABLE border="0">
<TBODY>
<TR>
<TD colspan="2" align="center">
<FONT size="-1">タイトル</FONT><INPUT size="139" type="text" name="title" value=$zokusei[0]>
</TD>
</TR>
<TR>
<TD colspan="2" align="center">
<FONT size="-1">サブタイトル</FONT>
<INPUT size="118" type="text" name="subtitle" value=$zokusei[1]>
</TD>
</TR>
<TR>
<TD valign="bottom"><FONT size="-1">文献<BR>
<INPUT size="20" type="text" name="bunken" value=$zokusei[2]><BR>
人物<BR>
<INPUT size="20" type="text" name="jinbutsu" value=$zokusei[3]><BR>
年月日<BR>
<INPUT size="20" type="text" name="nengappi" value=$zokusei[4]><BR>
<BR>
連続<INPUT size="4" type="text" name="renzoku" value=$zokusei[5]><BR>
<BR>
画像<BR>
<INPUT size="20" type="text" name="gazou" value=$zokusei[6]><BR>
横<INPUT size="5" type="text" name="yoko" value=$zokusei[7]> 縦<INPUT size="5" type="text" name="tate" value=$zokusei[8]></FONT></TD>
<TD valign="top" height="268">
<TEXTAREA rows="19" cols="90" name="text">$text[$n]</TEXTAREA>
</TD>
</TR>
<TR>
<TD align="left" colspan="2"><FONT size="-2">
リンク名</FONT><INPUT size="37" type="text" name="linkmei" value=$zokusei[9]><FONT size="-2">リンク</FONT><INPUT size="99" type="text" name="link" value=$zokusei[10]></TD>
</TR>
<TR>
<TD align="right" valign="top"><FONT size="-1">コメント</FONT></TD>
<TD>
<INPUT size="130" name="comment" value=$zokusei[11]>
</TD>
</TR>
<TR>
<TD colspan="2" align="center">
<INPUT type="submit" value="書き込み">
</TD>
</TR>
</TBODY>
</TABLE>
</FORM>
<FORM ACTION="dtb.xml">
<INPUT TYPE="submit" VALUE="ファイルに戻る">
</FORM>
</CENTER>
</BODY>
</HTML>
EOL
}

#フォームから送られてきた内容をデコードする
sub decode_f{
if ($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}

@pairs = split(/&/,$buffer);
foreach (@pairs) {
($name, $value) = split(/=/, $_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-f0-9])/pack("C", hex($1))/eg;
$value =~ s/</&lt\;/g; #htmlタグを禁止する
$value =~ s/>/&gt\;/g; #htmlタグを禁止する
$value =~ s/\r//g; #改行コード\rを消去
$value =~ s/\,/,/g; #半角コンマを全角コンマに
$FORM{$name} = $value;
}
}

#データ確認用(臨時)
sub datacheck_ante{
print <<"EOL";
$data<P>
記事番号: $FORM{'n'}<BR>
action : $FORM{'action'}<BR>
要素top: $FORM{'yoso_top'}<BR>
タイトル: $FORM{'title'}<BR>
サブタイトル:$FORM{'subtitle'}<BR>
文献 : $FORM{'bunken'}<BR>
人物 : $FORM{'jinbutsu'}<BR>
年月日 : $FORM{'nengappi'}<BR>
連続 : $FORM{'renzoku'}<BR>
画像 : $FORM{'gazou'}<BR>
横サイズ: $FORM{'yoko'}<BR>
縦サイズ: $FORM{'tate'}<BR>
リンク名: $FORM{'linkmei'}<BR>
リンク : $FORM{'link'}<BR>
コメント: $FORM{'comment'}<BR>
テキスト: $FORM{'text'}<BR>
要素end: $FORM{'yoso_end'}<BR>
EOL
exit;
}

sub datacheck_midle{
print <<"EOL";
$data<P>
記事番号: $n<BR>
action : $FORM{'action'}<BR>
要素top: $FORM{'yoso_top'}<BR>
タイトル: $zokusei[0]<BR>
サブタイトル:$zokusei[1]<BR>
文献 : $zokusei[2]<BR>
人物 : $zokusei[3]<BR>
年月日 : $zokusei[4]<BR>
連続 : $zokusei[5]<BR>
画像 : $zokusei[6]<BR>
横サイズ: $zokusei[7]<BR>
縦サイズ: $zokusei[8]<BR>
リンク名: $zokusei[9]<BR>
リンク : $zokusei[10]<BR>
コメント: $zokusei[11]<BR>
テキスト: $text[$n]<BR>
要素end: $FORM{'yoso_end'}<BR>
EOL
exit;
}

sub datacheck_post{
print <<"EOL";
$data<P>
action : $action<BR>
要素top: $yoso_top<BR>
タイトル: $title<BR>
サブタイトル:$subtitle<BR>
文献 : $bunken<BR>
人物 : $jinbutsu<BR>
年月日 : $nengappi<BR>
連続 : $renzoku<BR>
画像 : $gazou<BR>
横サイズ: $yoko<BR>
縦サイズ: $tate<BR>
リンク名: $linkmei<BR>
リンク : $link<BR>
コメント: $comment<BR>
テキスト: $text<BR>
要素end: $yoso_end<BR>
EOL
exit;
}