PHP:DOM XML関数:値(テキストノード)の更新
PHP (55 items)
2004年09月16日
<data.xml>
<?xml version="1.0" encoding="EUC-JP" ?>
<data>
<count>1</count>
</data>
このXMLをPHP DOM関数で作成するには以下のようなロジックとなる。
//空のドキュメントの作成
$dom = domxml_new_doc ("1.0");
//*** XMLデータ設定 ***
//ルートエレメントノード('data')設定
$e_data = $dom->create_element('data');
//ノード('count')設定
$e_count = $dom->create_element('count');
//テキストノードに'1'を設定
$t_cnt = $dom->create_text_node('1');
//('count')ノードにテキストノードを追加
$e_count->append_child($t_cnt);
//('data')ノードに('count')ノードを追加
$e_data->append_child($e_count);
//ファイルに保存
$text = $dom->dump_mem(true,'EUC-JP');
$fp = fopen('data.xml','wb+');
flock($fp, LOCK_EX);
fwrite($fp,$text);
fclose($fp);
ここで、「data.xml」のノード”count”の値をカウントアップするにはどうするか?
以下に、その一例を記す。
<data2.php>
//XMLファイルのオープン
$dom = domxml_open_file ('data.xml');
//*** XMLデータ設定 ***
//ルートエレメントノード('data')取得
$e_data = $dom->document_element();
//ルートエレメントノードの子ノード('count')を配列で取得
$ary_count = $e_data->child_nodes();
//('count')ノードの現在のテキストノードの値を取得
$cnt = $ary_count[0]->get_content();
$calc = (double)$cnt;
//カウントアップ
$calc = ++$calc;
//('count')ノードの子ノード(テキストノード)を配列で取得
$ary_text = $ary_count[0]->child_nodes();
//テキストノードを削除
//**注意**
//**テキストノードを変更するには、テキストノードを一度削除しなければならない
$ary_count[0]->remove_child($ary_text[0]);
//テキストノードを再設定
$ary_count[0]->set_content($calc);
//ファイルに保存
$text = $dom->dump_mem(true,'EUC-JP');
$fp = fopen('data.xml','wb+');
flock($fp, LOCK_EX);
fwrite($fp,$text);
fclose($fp);
・処理結果
<data.xml>
<?xml version="1.0" encoding="EUC-JP" ?>
<data>
<count>2</count>
</data>
この記事に関連した過去記事一覧は画面下にあります。
Comments
open wrote:
はじめまして、ossi様PHPとXMLのことを調べていて辿りつきました。
申し訳ありませんがいくつか質問がよろしいでしょうか?
私もPHPでXML出力しているのですが、更新のさいにXMLに情報を追加したいと考えております。
----phpソース----
<?php
$name_php = $_GET['name'];
$message_php = $_GET['message'];
$dom = new DomDocument('1.0', 'UTF-8');
$dataroot = $dom->appendChild($dom->createElement('dataroot'));
$tbl_items = $dataroot->appendChild($dom->createElement('tbl_items'));
$comment = $tbl_items->appendChild($dom->createElement('comment'));
$ID = $tbl_items->appendChild($dom->createElement('ID'));
$comment->appendChild(
$dom->createTextNode($message_php));
$ID->appendChild(
$dom->createTextNode($name_php));
$message_php = mb_convert_encoding($message_php, "UTF-8");
$name_php = mb_convert_encoding($name_php, "UTF-8");
//generate xml
$dom->formatOutput = true; // set the formatOutput attribute of
// domDocument to true
// save XML as string or file
$test1 = $dom->saveXML(); // put string in test1
$dom->save('tbl_items.xml'); // save as file
?>
----出力されたXML ----
<?xml version="1.0" encoding="UTF-8"?>
<dataroot>
<tbl_items>
<comment></comment>
<ID></ID>
</tbl_items>
</dataroot>
$name_phpと$message_phpはhtmlで入力した文字の部分です。
そして追加したい事は誰かが書き込みするたびに、
<comment></comment>
<ID></ID>
をXMLに追加するかたちをとりたいのですが、どのような処理を加えれば可能でしょうか?
たとえば
1人目がtest1と書き込みして
<?xml version="1.0" encoding="UTF-8"?>
<dataroot>
<tbl_items>
<comment>test1</comment>
<ID>test1</ID>
</tbl_items>
</dataroot>
とゆうxmlが作成されて
2人目がtest2書き込みすると
<?xml version="1.0" encoding="UTF-8"?>
<dataroot>
<tbl_items>
<comment>test1</comment>
<ID>test1</ID>
<comment>test2</comment>
<ID>test2</ID>
</tbl_items>
</dataroot>
とゆうふうに一人目が書いた内容を保存したまま2人目が書いた内容が上書きされるようにしたいのです。
xmlファイルは上書きされるかたちです。
色々調べてはみてるのですが、何かアドバイスいただけないでしょうか?よろしくお願いします。
2007年11月22日 14時32分45秒
open wrote:
こんにちは。コメントを残してから一週間ほど自分で色々試した結果、無事表示できました。
わざわざ質問してすいませんでした。
また訪問しにきますのでこれからも頑張ってください。
2007年11月30日 06時55分44秒
かえる。 wrote:
はじめまして。RUBYのXMLの読み書きでググっていたらここにたどり着きました。
私はPHPは全くわからないのですが、
<data2.php>でリードモディファイライトが発生するような気がします。
どうなんでしょ。
2008年10月07日 22時53分56秒
Add Comments
Trackback
トラックバックはありません
Trackback URL
http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=271