2012年6月19日火曜日

PHPでXMLを出力する

データベースを利用できない環境でデータをどう保持していこうか。
ありきたりかもしれませんがXMLかなと。。。

PHPではSimpleXMLを使うかDOMを使うか悩みそうなところですが
今回はDOMを触ってみました。
いくつかやったことをメモ程度に。

XMLファイルを生成する
// ファイル名
$filename = 'sample.xml';

// Domを生成
$dom = new DomDocument('1.0', 'utf-8');
$dom->formatOutput = true;

// 元となる要素を生成
$root = $dom->appendChild($dom->createElement('root'));
$head = $root->appendChild($dom->createElement('head'));
$body = $root->appendChild($dom->createElement('body'));

// ヘッダ要素を生成
$head->appendChild($dom->createElement('title', 'データファイル'));
$head->appendChild($dom->createElement('description', '説明'));

// ボディ要素を生成
// データ1
$content = $body->appendChild($dom->createElement('content'));
$content->appendChild($dom->createElement('name', '山田太郎'));
$content->appendChild($dom->createElement('age', '31'));
$content->appendChild($dom->createElement('gender', '男'));

// データ2
$content = $body->appendChild($dom->createElement('content'));
$content->appendChild($dom->createElement('name', '山田花子'));
$content->appendChild($dom->createElement('age', '28'));
$content->appendChild($dom->createElement('gender', '女'));

$dom->save($filename);

生成されたファイル
<?xml version="1.0" encoding="utf-8"?>
<root>
    <head>
        <title>データファイル</title>
        <description>説明</description>
    </head>
    <body>
        <content>
            <name>山田太郎</name>
            <age>31</age>
            <gender>男</gender>
        </content>
        <content>
            <name>山田花子</name>
            <age>28</age>
            <gender>女</gender>
       </content>
    </body>
</root>

次にXMLに要素を追加する
// ファイル名
$filename = 'sample.xml';

// ファイルを読み込む
$dom = new DomDocument('1.0', 'utf-8');
$dom->load($filename);

// 追加する場所を探す
$xpath = new DOMXPath($dom);
$xml = $xpath->query('/root/body');

// データ
$content = $xml->item(0)->appendChild($dom->createElement('content'));
$content->appendChild($dom->createElement('name', '鈴木一郎'));
$content->appendChild($dom->createElement('age', '38'));
$content->appendChild($dom->createElement('gender', '男'));

$dom->save($filename);

こんなかんじで。場所の指定の仕方がわからなくてなんか格好わるい。。。
SimpleXMLならもっとスマートにかけそうだけど。。。

XPathで複数の条件式を指定する
DOMXPathを使うことでXMLファイルからデータの検索とかができます。
追加のプログラムでは '/root/body' とだけ指定しました。
これはそのまま、'/root/body' 要素を取得します。
content要素を取得する場合は '/root/body/content' とすることで複数のcontent要素が抽出されます。

ここに条件式を記述することもできます。
'/root/body/content[gender="男"]'
とか
'/root/body/content[gender="男"][age=31]'
[ ] を複数記述すると and式 となるみたいです。
orは | です。

最後に基本的ですがノードの名前と値を取得する
$p->nodeName;
$p->nodeValue;

恥ずかしながらはじめこれに手間取ってなかなか進みませんでした。。。


今回はじめてDOMを操作してみましたがわりと面白かったんでもぉ少し勉強してみます。





0 件のコメント:

コメントを投稿