【PHP入門】意外と簡単!DOMDocumentを使ったXMLに出力する方法まとめ

こんにちは!エンジニアのオータケです!

Webサービスや業務システムを作る際など、XMLを出力するプログラムを組んだことはありますか?

また、これからXMLを出力するプログラムを組みたいと思ったことはありますか?

この記事ではXMLの出力について次のような内容をわかりやすく解説しています!

[基礎] XMLとはなにか
[基礎] SimpleXMLを用いた出力方法
[基礎] DOMDocumentを用いた出力方法
[実践] XMLの出力内容を整形して見やすくする
[実践] XMLの出力内容が文字化けすることに対しての対処法

ではさっそく学んでいきましょうー!

目次

XMLとは

まず、XMLとはなんでしょうか?

一言で簡単に表現すればデータと文章が一緒になった見やすいHTMLのようなものと言えるでしょう。

そもそもHTMLがわからないよ・・・

という人はこちらをご覧ください。

XMLにはHTMLと違い、タグ名やタグの属性などを自由に決めることができます。

XMLは単体で使うというよりはプログラム言語を用いてデータ処理を行うために用いることが多いです。

SimpleXMLを使って書き出す方法

まずはSimpleXMLという機能を使ってXMLデータを出力する方法について解説します。

扱い方はとても簡単です、まずはコードを見てみましょう!

今回はRSS風のデータ構造を出力してみます。

<?php
$xml = new SimpleXMLElement('<item></item>');

$xml->addChild('title', 'TitleName');
$xml->addChild('description', 'description value');

echo $xml->asXML();
?>
<?xml version="1.0"?>
<item><title>TitleName</title><description>description value</description></item>

まず、SimpleXMLElementオブジェクトを生成します。

次にaddChildメソッドを使ってtitle要素やdescription要素を追加します。

addChildの第二引数には第一引数で指定した要素の内容を記述します。

最後にasXMLメソッドを使ってXMLデータを出力します。

このasXMLメソッドにファイル名を引数として与えるとファイルとして出力しますが、省略することで文字列として返します。

出力するとしっかりXMLのデータが吐き出されているのがわかりますよね!

使い方はこれだけです。

ただし、出力した内容は少し見づらいですよね。

人間が見やすいように整形してみたいのですがどうするとよいでしょうか?

DOMDocumentを使うことで実現することができます。

まずはDOMDocumentの使い方を見てみましょう!

DOMDocumentを使って書き出す方法

基本的な使い方

まずは基本的なDOMDocumentの使い方をみてみましょう!

<?php
$document = new DOMDocument();

$title = $document->createElement('title');
$title->appendChild($document->createTextNode('Hello DOM Document!'));

$description = $document->createElement('description');
$description->appendChild($document->createTextNode('Message'));

$item = $document->createElement('item'); 
$item->appendChild($title);
$item->appendChild($description);

$document->appendChild($item);

echo $document->saveXML();
?>

先程のSimpleXMLの例と比べると少々長いですよね?

今回のDOMDocumentでの例は先程と同じRSS風のデータを出力するサンプルですがこれだけ差が出ます。

まずDOMDocumentオブジェクトを生成したあとにtitle要素を作成し、その値として「Hello DOM Document!」を追加しています。

次にdescription要素を作成し、値にMessageという文字列を追加しています。

最後にこの2つの親要素であるitem要素を生成し、$itemに対して$titleと$descriptionの2つを追加します。

わかりやすく階層構造でイメージしてるとこのような形です。

$item
  $title
    Hello DOM Document
  $description
    Message

最後にsaveXMLメソッドを使ってXMLを出力しています。

実行結果は次のとおりです。

<?xml version="1.0"?>
<item><title>Hello DOM Document!</title><description>Message</description></item>

先ほどと同じような形で出力されていると思いますが、少し見づらいですよね・・・

人間がパッとみでわかるような形にはなっていないかと思います。

ではこのDOMDocumentを使って人間が見やすいように整形したXMLを出力してみましょう!

整形して出力する場合

では早速、人間が見やすいように整形したXMLを出力する方法について見てみましょう。

先程のコードを使い見ていきます。

<?php
$document = new DOMDocument();

$document->formatOutput = true;

$title = $document->createElement('title');
$title->appendChild($document->createTextNode('Hello DOM Document!'));

$description = $document->createElement('description');
$description->appendChild($document->createTextNode('Message'));

$item = $document->createElement('item'); 
$item->appendChild($title);
$item->appendChild($description);

$document->appendChild($item);

echo $document->saveXML();
?>

先程のコードに1行足しただけです!

オブジェクトを生成した直後に、

$document->formatOutput = TRUE;

があるかと思います。

このformatOutputをTRUEにすることでコードが整形されてます。

実行結果:

<?xml version="1.0"?>
<item>
  <title>Hello DOM Document!</title>
  <description>Message</description>
</item>

このように自然な形で出力されているのがわかるかと思います!

出力したXMLが文字化けする場合

ここまでは基本的な使い方について解説をしてきました。

XMLの値や要素に日本語といった文字列が入っていて出力した結果文字化けしてしまうなどの問題が起きる場合があります。

そういった場合はどうすればよいでしょうか?

DOMDocumentを使う場合は次のように、

$document = new DOMDocument();
$document->encoding = ‘UTF-8’;

と指定することで文字化けを避けることができます。

XMLデータを読み込む方法

ここまではXMLを出力する方法について解説してきました!

もし、XMLデータを読み込みたい場合は次の記事をご覧ください!

この記事をご覧いただくことで読み込み方をマスターすることができます!
XMLの読み込み・書き込みともにマスターしましょう!

まとめ

いかがでしょうか?

今回はXMLの出力方法について解説しました。

読み込みの時同様、問題なければSimpleXMLを使うほうが楽でしょう!

もし、細かく設定して使う場合やXMLを整形して出力した場合はDOMDocumentを使うことをおすすめします。

用途によってうまく使い分けていくていきましょう!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次