F.Ko-Jiの「一秒後は未来」

SimpleXMLでCDATAを取得したいときはLIBXML_NOCDATAを使う

Yahoo!知恵袋のAPIをさわっていて、レスポンスに含まれるCDATAがSimpleXMLで取得できてないことに気づきました。

APIを叩くために汎用の自前クラスを利用しているのですが、その中で

$res = @simplexml_load_string($xml);
$res = @simplexml_load_file($url);

このように simplexml_load_string と simplexml_load_file を使っていたのですが、これではCDATAを無視してしまうようです。

リファレンスによると第3引数に追加のLibxmlパラメータを指定することができて、そのパラメータの一つである LIBXML_NOCDATA というオプションを指定すると、CDATAをテキストデータとして取得することができるようです。

» PHP: simplexml_load_file – Manual
» PHP: 定義済み定数 – Manual

なので、先のコードは次のように修正してあげました。

$res = @simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$res = @simplexml_load_file($url, 'SimpleXMLElement', LIBXML_NOCDATA);

ちなみに第2引数は返されるオブジェクトのクラス名で、もしSimpleXMLElementクラスを継承したクラスを自作していればそのクラス名を指定できるらしいです。なので通常は ‘SimpleXMLElement’ を指定しておけば大丈夫です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など