XMLを整形して出力する

また長いこと放置状態になっていたのでつまらないTipsでお茶を濁してみる。


外部システムの連携なんかをやってるとXMLでデータをやり取りすることがあると思うんだけど、システムが吐いてくるXMLって改行が入ってなかったりするので、デバッグで覗いたりログに残したりするのに不便だったりするんだよね。改行無しのXMLが100KBとかもはや人間には読めないしw


で、そんな時に綺麗に整形して出力する方法。
こんな感じでformatOutputなるプロパティをTRUEにしてやれば綺麗に整形して出力してくれる。

<?php

$xmlString = '<?xml version="1.0"?><foo><bar order="1">hoge</bar><bar order="2">テスト</bar></foo>';

// stringからDOM構築
$dom = DOMDocument::loadXML($xmlString);

// encodingが指定されてないと&#x30C6;&#x30B9;&#x30C8;みたいになるので何か指定する
// ログ目的なら問答無用でUTF-8とかに統一してもいいと思う
if (!$dom->encoding) {
    $dom->encoding = 'UTF-8';
}

// 整形して出力するフラグ
$dom->formatOutput = true;

// 文字列で取得
echo $dom->saveXML();
<?xml version="1.0" encoding="UTF-8"?>
<foo>
  <bar order="1">hoge</bar>
  <bar order="2">テスト</bar>
</foo>


だいたいどの言語、どのライブラリでも似たようなオプションがあると思うので探してみるといいかも。
どうしてもない場合はXSLTを使うという技もあるらしい。