トップページ » PHP SimpleXMLでXMLパースをするときの注意点まとめ

PHP SimpleXMLでXMLパースをするときの注意点まとめ


XMLをPHPで扱うときにPHP5からであれば、SimpleXML エクステンションを使えば
XML構造を1つのオブジェクトとして扱うことができます。

それで、私も最近SimpleXMLを使用するのですが
そのときに、ふと疑問に思ったこと、つまづいたことをまとめておきます。


■SimpleXMLでは、CDATAの情報を取得できない?

私がレンタルしているSAKURAインターネットのサーバでSimpleXMLを使おうとしたとき
XMLデータのCDATAで記述されている部分は取り出すことができませんでした。

一般的には



$contents = file_get_contents( $URL );
$xml = simplexml_load_string( $contents );



このように記述すると思います。(simplexml_load_fileもありますね。)

しかし、これだとCDATA部分はスルーされてしまいます。

そんなときは・・・



$contents = file_get_contents( $URL );
$xml = simplexml_load_string( $contents, 'SimpleXMLElement', LIBXML_NOCDATA );


こうすることによって、CDATAの部分もきちんと解析してくれます。

第3引数にLIBXML_NOCDATA というオプションを指定することがポイントらしいです。

詳細は

F.Ko-Jiの「一秒後は未来」- SimpleXMLでCDATAを取得したいときはLIBXML_NOCDATAを使う

を参考にしていただければと思います。
fkojiさん、ありがとうございます。






■SimpleXMLでは名前空間の取得が、かったるい

たとえば、http://feedproxy.google.com/hatena/b/hotentry

このXMLをパースしようとした場合


< title >
< link >
< description >


は問題なく取得できるのだけど

<dc:subject>

これはスルー・・・。 残念すぎる。

これもまた、先人の知恵を拝借。

.☆★ ステレオタイプラボ ★☆. - [php]simplexml_load_fileでうまくパース出来ない、なんて事はない。& 正解とお手軽方法

ようするに、きちんとしたパースする方法はあるのだけど、
パースできさえすれば問題ないからの : 'コロン'を
ちがう文字にリプレイスしてからパース・・・。 なるほど。。。素敵です。

DOMを使った時はこの問題は起こらなかった気がするが、、、まぁ、いいや。

ステレオタイプラボさん、ありがとうございます。




■SimpleXMLではitem["0"]は気にしなくていいのですね!!


PHP4環境だと、SimpleXMLがバンドルされていないので
PEAR::Configとか、PEAR::XML_Serializerを使ってXMLを配列に変換して
使用していました。

でも、そのときよく引っかかったのは<item>単位で
記事が入っているRSSを扱うときに、記事が1つだけだと
配列構造が変化しちゃうのですよね。

ようするに



print_r ( $item );

とすると
複数のitemを持っている場合は
array(
'0' => array(
'title' => *****,
'link' => *****,
'description' => *****,
),
'1' => array(
'title' => *****,
'link' => *****,
'description' => *****,
)
・・・省略

となるのだが、

itemが一つしかないと

array(
'title' => *****,
'link' => *****,
'description' => *****,
)

となってしまう。



これに気を付けておかないと、上記の配列をforeachで回して
使うときに記事が1つだけの場合、エラーになっちゃうのですよね。

この問題って、SimpleXMLの場合はどうなんだろうと思っていたのですが
心配ご無用でした。



$item = $xml->channel->item;
foreach( $item as $value ){
// 出力処理
}



こんなかんじで、特に例外処理を挟むことなく
記事が一つだけのRSSを処理してみたのですが
エラーは起こりませんでした。ご安心を〜。




ダラダラと書きましたが、SimpleXMLを使ってパースするときに
つまづいた点は今のところ、以上です。

もし、他の箇所でアレ?と思ったら追加していきます。

ウッディーgnoot  at 03:37
トラックバックURL
コメントを書く




情報を記憶: 評価:  顔   星