PHPでXMLを触る
API連携でXMLをはじめてさわったので覚え書きします
XMLとは
Extensible Markup Language(エクステンシブル マークアップ ランゲージ)は、基本的な構文規則を共通とすることで、任意の用途向けの言語に拡張することを容易としたことが特徴のマークアップ言語の総称である。一般的にXML(エックスエムエル)と略称で呼ばれる。JISによる訳語は「拡張可能なマーク付け言語」。
引用: wikipedia『Extensible Markup Language』
HTMLっぽい表現でオブジェクトっぽい配列っぽい表現が可能になり、そこに記載されたデータを取り出したり集計したりすることが可能です
<?xml version="1.0" encoding="UTF-8"?>
<profile>
<name>ryoma</name>
<age>25</age>
<birthday>October 10th</birthday>
</profile>
上記が生のXML。これだけではプログラム的にはなんのことかわからないので
このデータを変換したりすることで「ryoma」が[name]なんだな、とか、[age]は「25」なんだな、というのがわかるようになります
XMLをPHPから生成するときはDomDocument()クラスを使います
上記XMLは以下のphpコードで生成することができます
HTMLみたいにJavascriptっぽい書き方で構造を生成することができます
// 例
// 要素の生成
$element = $dom->createElement("profile");
// とじる
$profile = $dom->appendChild($element);
↑をつかって以下のように書きます。
$dom = new DomDocument("1.0", "UTF-8");
// 字下げとかをきれいにしてくれるメソッド
$dom->formatOutput = true;
// <profile> 一番親の要素
$profile = $dom->appendChild($dom->createElement("profile"));
// <name> profile直下のname要素を生成という意味です
$profile->appendChild($dom->createElement("name", 'ryoma'));
// <age> profile直下のage要素を生成という意味です
$profile->appendChild($dom->createElement("age", '25'));
// <birthday> profile直下のbirthday要素を生成という意味です
$profile->appendChild($dom->createElement("birthday", 'October 10th'));
// 生成完了
$xml = $dom->saveXML();
API連携等でXMLが必要になったとき、APIにXMLデータをエンコードして渡さないといけないので
// エンコーディング
$encodeXML = base64_encode($xml);
とか書きます
続いてAPI連携でXMLを受け取る場合
POSTかなにかでAPIからデータを受け取ると思うのですが、受け取ったあといい感じにデータをプログラムに落とし込むには、XMLデータをオブジェクトっぽく配列っぽく扱う必要があります
※手法としては2通りあるが、ひとつはXMLと相性があまりあわない頃のPHP4(現在PHP5か7)に対応した:angel: ハイパー化石手法:skull: なのでここでは別の1つしか紹介しない
それがsimplexml_load_string()という関数
// APIからぐちゃぐちゃな情報でデータを受け取ることになると思うのでデコード
$catchData = {もらったデータ};
$XML = base64_decode($catchData);
// XMLをオブジェクトで使用できるようにする
$objXML = simplexml_load_string($XML); // 最初で言ってた配列っぽい形にするというのがこれ
関数simplexml_load_string()を使うことで、序盤に書いた生のXMLを参考にすると
$name = $objXML->profile->name
と記述すれば変数$nameには<name>要素で囲まれた値「ryoma」を取り出すことができる
あとは必要に応じて受け取ったXMLをDBに保存するなり、次の連携のために新しくXMLを生成したりしてください
エラー処理とかもありますが下記の参考にしたサイトがわかりやすいと思います
参考
PHP.net: DOMDocument クラス
PHP.net: libxml
Discussion