[PHP/テクニック] PHPでXMLを出力する
篠原 隆司
アフィリエイト広告を利用しています
このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です
PHP5で、XMLをDOMで扱おうとしたら・・・じゃなくって調べようとしたら、イマイチな検索結果が多くて難航したのでメモしときます。
ちなみに、なにに【難航】したのかってはなし。
PHPのXMLのDOM操作って、PHP4系とPHP5系で、かなり違っているということ。
これが何を意味するのかっていうと・・・
Googleさんの指し示す結果が、PHP4を対象にしたものであったり、PHP5を対象にしたものであったり、ごちゃまぜになってて、どれが本物なのか分からなくなるから。
ということで、PHP5でのXMLのDOM出力。
やろうとしていること
- データをXML形式でエクスポートする。
- ファイル名は、export.xml とする。
- PHP5で動作する。
<?php
$filename = 'export.xml'; // ファイル名
$dom = new DomDocument('1.0'); // DOMを作成
$dom->encoding = "UTF-8"; // 文字コードをUTF-8に
$dom->formatOutput = true; // 出力XMLを整形(改行,タブ)する
$ExportData = $dom->appendChild($dom->createElement('ExportData'));
$Head = $ExportData->appendChild($dom->createElement('Head'));
$Body = $ExportData->appendChild($dom->createElement('Body'));
// ヘッダID を <Head>に
$HID= $Head->appendChild($dom->createElement('HeadID'));
$HID->appendChild($dom->createTextNode('ヘッダID'));
// ヘッダタイトル を <Head>に
$HTtl= $Head->appendChild($dom->createElement('HeadTitle'));
$HTtl->appendChild($dom->createTextNode('ヘッダタイトル'));
// 内容1 を <Body>に
$BContent= $Body->appendChild($dom->createElement('Content'));
$BContent->appendChild($dom->createTextNode('内容1'));
// 内容2 を <Body>に
$BContent= $Body->appendChild($dom->createElement('Content'));
$BContent->appendChild($dom->createTextNode('内容2'));
// HTTPヘッダを出力して
header("Content-disposition: attachment; filename=" . $fileName);
header("Content-type: application/octet-stream; name=" . $fileName);
// DomXMLをXML形式で出力
echo $dom->saveXML();
で、これを実行すると、ファイルのダウンロードダイアログが出てきて、次の内容が出力されます。
<?xml version="1.0" encoding="UTF-8"?>
<ExportData>
<Head>
<HeadID>ヘッダID</HeadID>
<HeadTitle>ヘッダタイトル</HeadTitle>
</Head>
<Body>
<Content>内容1</Content>
<Content>内容2</Content>
</Body>
</ExportData>
XMLのDOM操作のポイントとして・・・
createElement または createTextNode で、【物】を作って
appendChild で、【格納】する。
appendChild の戻り値は、引数と同じ・・・つまり中に入れた物・・・になる。
ちなみに、DOMでXMLを出力しようとした理由・・・
もともとの目的は、MySqlからデータを引っ張ってきてエクスポートすることなので、わざわざDOMなんて使わなくたって、
<?php
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<ExportData>';
echo '</ExportData>';
って手打ちで書いていけばいいんだけどね。。。
こっちのほうが楽だし、コードの見た目が出力の見た目そのもので分かりやすいし、実行速度もDOM使うよりは断然早そうだし・・・。
それをしなかったのは、やっぱりDOM使うほうが色々楽だし。
特に例を出すとするとこのあたりかな~
- 変数の値に < & > が入っていたなどで、エスケープする必要がない
- タグの閉じ忘れ、タグの不適切な入れ子の心配がない
- 出力時の改行やタブなど見栄えを勝手にやってくれる(formatOutput)