TOP XML & CGI 目次

XMLでデータベース
編集データを既存データと置き換える/いろいろな問題
すべてのデータを配列に読み込み(赤字)、データファイルに一気に書き出します。
編集データの順位$FORM{'n'}にあたる配列($data[$n])を編集データ($data)に置き換えます(青字ボールド)。
さらに記事番号1番の頭にはルート要素名をつけます。記事番号最後の末尾にもルート要素名の終了タグをつけます。
test08b.cgi
#!/usr/bin/perl

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

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

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

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){
$n++;
}
$data[$n-1] = $data[$n-1]."\<\/".$element_root."\>";

(以下省略)

その他いろいろな問題
上記プログラムで編集・保存をするとデータファイルの要素名が欠けるという問題。
これは以前、chop命令で行っていましたが、大切な終了タグまで消してしまうので以下のように直しました。

#データを配列に入れる
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/</&lt\;/g; #htmlタグを禁止する
# $data[$n] =~ s/>/&gt\;/g; #htmlタグを禁止する
$data[$n] =~ s/\n//g; #改行コードを除く
$n++;
}
}
編集後、改行が取れてしまう問題。
これは単純なミスでした。以下のように{ }とすべき所を[ ]で囲ってました。
$FORM['text'] =~ s/\n/&lt\;br\/&gt\;/g; #テキストの改行を無効にする