[PHP/テクニック] PHPでXMLを出力する

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)