simplexml_load_file関数で取り出せないサイトがある - PHPプロ!Q&A掲示板

2614

  • 0P

simplexml_load_file関数で取り出せないサイトがある

質問日時 / 2010年3月10日 05:17    回答数 / 6件

Questioner:  hayato0210  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

simplexml_load_file関数で取り出せないファイルがあるのですが何故なのでしょうか?
例えばなのですが
http://ocntoday.blogzine.jp/top/whatsday.xml
のサイトです。
又、出来れば取り出す方法があれば教えて頂きたいのですがお願いできないでしょうか?

  1. $rss = @simplexml_load_file('http://ocntoday.blogzine.jp/top/whatsday.xml');
  2. print '<pre>';
  3.   print_r($rss);
  4.   print 'ああ';
  5. print '</pre>';

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix何故かはわかりませんが、記事の文字列中にBOMが紛れ
 ┗A01-1hayato0210ご回答ありがとうございます。 値は取得できているよ
  ┗A01-1-1shimix「取り出せない」ということだったので、こちらで(エ
   ┗A01-1-1-1hayato0210すみませn・・・。 shimixさんのソースを使って値を
    ┗A01-1-1-1-1shimix>shimixさんのソースを使って値を取得できたようなの
     ┗A01-1-1-1-1-1hayato0210出来ました>< 本当にありがとうございました。 又

回答一覧

並び替え:

A01
answerershimix [3月10日 09:14]

何故かはわかりませんが、記事の文字列中にBOMが紛れ込んでいるようです。

  1. print strpos(file_get_contents('http://ocntoday.blogzine.jp/top/whatsday.xml'), 0xefbbbf);

いったん文字列として取得してBOMを削除すれば問題ないようです。

  1. $file = str_replace(0xefbbbf, '', file_get_contents('http://ocntoday.blogzine.jp/top/whatsday.xml'));
  2. $rss = simplexml_load_string($file);

この意見に回答する

ツリーへ TOPへ

A01-1
replyerhayato0210 [3月10日 09:51]

ご回答ありがとうございます。
値は取得できているようなのですが文字化けを起こしてしまいます・・・。
xmlがUTF-8のようでしたのでソースをUTF-8(BOM無し)で試してみたのですが駄目でした。

mb_convert_encodingをかけてみたのですが駄目なようです。
shimix様はどの様な環境下で実行できたのでしょうか?
また出来ればUTF-8のソースでも対応できるようにはならないでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyershimix [3月10日 10:28] (最終編集:3月10日 10:58)

「取り出せない」ということだったので、こちらで(エラー抑制を外して)試したのと同じようにsimplexml_load_file()時点でエラー(xmlファイルのURL:1: parser error : Start tag expected, '<' not found)になっていると思ったのですが違うようですね。

>値は取得できているようなのですが文字化けを起こしてしまいます・・・。

それならそうと最初に書いてください。

ブラウザに返している文字コードは何でしょう?ブラウザ側で判断しているエンコードはどうなっていますか?ブラウザ側のエンコードを変えたらどうなりますか?

>mb_convert_encodingをかけてみたのですが駄目なようです。

「駄目なようです」では、何らかのエラーになるのか・変換されないのか・変換結果がおかしいのかさっぱりわかりませんが、例示されたソースではprint_r()しかされてませんよね。何をmb_convert_encodingの第1引数にされているんでしょう?

mb_convert_encoding()は『個別の文字列』に対して行うことになると思いますけど。
 
   http://www.php.net/manual/ja/function.mb-convert-encoding.php
  (第1引数はstringです)

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerhayato0210 [3月11日 08:07]

すみませn・・・。
shimixさんのソースを使って値を取得できたようなのですが
うまく表示できていないということです・・・。

UTF-8でソースを下記、ソースにもUTF-8だということを明記してあります。
ブラウザもUTF-8にしているのですが取得した値を見ると文字化けを起こしております。

mb_convert_encodingの引数は取ってきたxmlです。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyershimix [3月11日 09:16] (最終編集:3月11日 10:05)

>shimixさんのソースを使って値を取得できたようなのですが
>うまく表示できていないということです・・・。

私は(残念ながら)エスパーではないので「hayato0210さんが何をしたのか」は書いていただかないとわかりません。面倒でしょうが、ちゃんと書いてください。


>ブラウザもUTF-8にしているのですが取得した値を見ると文字化けを起こしております。

>mb_convert_encodingの引数は取ってきたxmlです。 

前のレスでも書きましたが、mb_convert_encodingにはstringしか渡せません。取得したxml(SimpleXMLオブジェクト)を渡した場合にどういう動作をするかは、やったことがないのでわかりません。

#今こちらの環境で試したら、戻り値は「改行コード×2」だけでした。文字化け以前の問題ですね(汗


取得したデータ(utf-8)をそのまま表示(print_rvar_dump)して、ブラウザのエンコードがutf-8なら何もしなくても化けません(phpソース自体はasciiでかまわない)。mb_convert_encodingをカットしてみてください。

なお、SimpleXMLオブジェクトから個々の要素を扱う場合には、出力したい文字コードに合わせて個々にmb_convert_encodingをします・・というのも前回のレスで書きましたね。

  1. <?php
  2. $file = str_replace(0xefbbbf''file_get_contents('http://ocntoday.blogzine.jp/top/whatsday.xml'));
  3. $rss = simplexml_load_string($file);
  4.  
  5. #var_dump($rss); // この出力はutf-8のままになる。
  6.  
  7. foreach ($rss->channel->item as $item) {
  8.   print date('Y/m/d'strtotime($item->pubDate));
  9.   print "" . $item->category . "";
  10.   // title(文字列)をsjisに変換して出力
  11.   print mb_convert_encoding($item->title'sjis''utf-8') . "<hr />"
  12.   }
  13. ?>

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyerhayato0210 [3月12日 11:46]

出来ました><
本当にありがとうございました。
又、今回は失礼しました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)