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’ を指定しておけば大丈夫です。
コメントを残す