PHP5でsimple_xml_load_fileする前に文字コードを変換できますか?

このQ&Aのポイント
  • PHP5でRSSリーダーを作る際に、simple_xml_load_fileを使用してRSSを読み込んでいる場合、文字コードの変換に関する問題が発生することがあります。
  • simple_xml_load_fileを使用する前に、文字コードを変換することはできますか?エラーが発生しているRSSの文字コードがShift_JISである場合、文字コードの変換が可能ならば問題を解決できる可能性があります。
  • 質問者は、simple_xml_load_fileする前に文字コード変換ができるのかを知りたいと思っています。ご存知の方がいらっしゃいましたら、教えていただけると幸いです。
回答を見る
  • ベストアンサー

PHP5でsimple_xml_load_fileする前に文字コードを変換できますか?

php5でRSSリーダーを作っています。 simple_xml_load_fileを使ってRSSを読み込んでいるのですが、サイトによって、読み込みの時点でエラーが出てしまいます。 『Warning: simplexml_load_file() [function.simplexml-load-file]: input conversion failed due to input error, bytes 0x87 0x99 0x81 0x4B』 上記のようなエラーが出ます。エラーの出たRSSの文字コードがShift_JISだったので文字コードさえ変換できればうまくいくと思うのですが、simple_xml_load_fileする前に文字コード変換ってできるのでしょうか?ご存知の方いましたらお願いします。

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

他のサイトから読み込むのでしょうから、 いったんfileとかで読込み mb_convert_encoding とかして後結合して simplexml_load_string で読み込むとかすればいいのでは

ichigensan
質問者

お礼

あ、なるほど「simplexml_load_string」なんてものがあったんですね。 以下のようにfile_get_contentsで文字列として読み込んでから、mb_convert_encodingで文字コード変換して、simplexml_load_stringできちんとパースできました。これでなんとか行けそうです。本当にありがとうございました。 $xmlstr = file_get_contents($rss); mb_convert_encoding($xmlstr,"UTF-8"); $xml = simplexml_load_string($xmlstr);

関連するQ&A

  • PHP5でsimple_xml_load_fileするとエラーになっちゃいます。

    simple_xml_load_fileを使ってXMLを読み込んでいるのですが、読み込みの時点でエラーが出てしまいます。 Warning: simplexml_load_file() [function.simplexml-load-file]: input conversion failed due to input error, bytes 0xAD 0xB5 0x3C 0x2F ↑こんな感じです。 原因を探ったところ、XMLファイルのデータ中にローマ数字(I、II、・・)があるとこのようになることが分かりました。 ちなみにsimplexml_load_stringを使用してもほぼ同様のエラーが発生しました。 ローマ数字入りのXMLファイルを読み込むことはできないのでしょうか?ご存じでしたら知恵を拝借したいのですが・・・。 ※SAX、DOMでも読み込めず(T_T)

    • 締切済み
    • PHP
  • PHPでXMLファイルを読み込みたい

    PHPを使ってxmlファイルを読み込んで、タグの中のデータなどを読み込んだりしたいです。 ですが、自作のxmlファイルだと simplexml_load_file()で読み込めません。xmlファイルの文字コードを色々と変えて試してみましたが、できませんでした。 ちなみに以下のコードは正常に動きました。Yahoo!のxmlファイルです。 $url = "http://rss.weather.yahoo.co.jp/rss/days/5710.xml"; $rss = simplexml_load_file($url); 出力は「【 25日(金) 嶺北(福井) 】 晴れ - 23℃/8℃ - Yahoo!天気・災害」でした。 何度かやるうちにアルファベットは表示できても日本語が表示できないということもありました。 また、xmlファイルをphpのプログラムに作らせたいです。そのときに、simplexml_load_file()で読み込める日本語も含むxmlファイルをphpで作成するプログラムを教えていただけると嬉しいです。 お願いします。

    • ベストアンサー
    • PHP
  • simplexml_load_fileのエラー

    AmazonのAPIを使ったWebサイトを作っていて、simplexml_load_fileを使って外部サーバのXMLを読み込もうとしています。 ローカル・サーバ1ではうまくいきますが、サーバ2ではI/O warning : failed to load external entity となり読み込めません。 3つのサーバで使用しているプログラムは全く同じです。 PHPのバージョン、SimpleXMLのRevisionは下記の通り。 ローカル:5.2.5、1.151.2.22.2.35 サーバ1:5.2.9、1.151.2.22.2.46 サーバ2:5.2.9、1.151.2.22.2.46 調べていると、XML文字列の中に実体参照等パースエラーとなる文字が含まれているとこのようなエラーが出るとのことでしたが、該当するような文字列はありませんし、同じプログラムでも別のサーバであれば取得できるのでその可能性は考え辛いですが、この場合の対処方法として、file_get_contentsで一度文字列として受け取ってから、simplexml_load_stringでパースするとあったので、それも試しました。 しかし、simplexml_load_fileであれば数秒で取得できるものが、file_get_contentsだと4分以上かかりました。 できればsimplexml_load_fileで行いたいのですが、上記のような違いが出る可能性として考えられることは何かありますでしょうか。

    • 締切済み
    • PHP
  • RSSのXMLロードで失敗してしまう

    RSSのデータを取得する、という処理を行いたいのですが、 文字コードの件でひっかかってしまっているようで なかなか前に進むことができません。 ************ // RSSの内容を取得する $rss_text = file_get_contents(※RSSのフィードURL); // RSSの文字エンコーディングを変換→再変換 $rss_text = mb_convert_encoding($rss_text, 'SJIS', 'UTF-8'); $rss_text = mb_convert_encoding($rss_text, 'UTF-8', 'SJIS'); $rss_text = preg_replace('/[\x00-\x1f]/', '', $rss_text); // RSSをパースする $rss_xml = new SimpleXMLElement($rss_text); if ($rss_xml) { // XML解析に成功した場合 // SimpleXMLElementオブジェクトからデータを取得 $items = $rss_xml->item; foreach($items as $item) { echo 'ID:'. $item->guid. '<br />'; echo 'リンク:'. $item->link. '<br />'; echo '日付:'. $item->pubDate. '<br />'; echo 'タイトル:'. $item->title. '<br />'; echo '本文:'. $item->description. '<br />'; } } ************ こういったコードを組んでいるのですが、現状では Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : attributes construct error in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Couldn't find end of Start Tag rss line 1 in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Extra content at the end of the document in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... このようなエラーが表示されてしまいます。 自分なりに文字コードを処理しているつもりではあるのですが、 他にも何かしなければならないことがあるのでしょうか? どうぞ知恵を貸していただければと思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • simplexml_load_fileについて

    simplexml_load_fileでrssを読み込んでいるのですが、 rssのxmlファイルが少し特殊でリンクが抜けているitemがあり、 以降ずれ込んで読まれてしまい困っています。 ■xml例 <root> <item> <title></title> <link></link> </item> <item> <title></title> <link></link> </item> <item> <title></title> ←リンクがぬけている </item> <item> <title></title> <link></link> </item> </root> ■php側 抜粋/割愛 $xml = simplexml_load_file($this->xmlPath) or die("ファイルが読み込まれません"); //xpathにて各ノードを取得 $title = $xml->xpath(//title); $link = $xml->xpath(//link); for($i = 0; $i < 3; $i++) { <a href="<?=$link[$i]?>"> <?=$title[$i]?> </a> } のように取得して、html加工して 吐き出しているので、linkがないノードがあると 後のものがどんどんずれて読み込まれてしまいます・・・ どのようにしたら解決できますでしょうか・・・

    • 締切済み
    • PHP
  • simplexml_load_fileについて

    お世話になります。 simplexml_load_fileについて質問です。 下記のようなコードでライブドアブログのRSSを解析しようとしております。 ブログ記事の全文を取得したいのですが、一部分しか取得することが出来ません アドバイスをお願いします。 宜しくお願いします ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// $rss = $data['blog_rss']; $xml = @simplexml_load_file($rss,'SimpleXMLElement', LIBXML_NOCDATA); #ブログタイトル $data['xml']['title'] = $xml->channel->title; #ブログ説明 $data['xml']['description'] = $xml->channel->description; #最大件数 $max_lines = 8; $i=0; foreach ($xml->item as $item) { $ns = $item->getNamespaces(true); $date = $item->children($ns["dc"]); //記事のリンク先 $data['xml']['kiji'][$i]['link'] = $item->link; //記事の見出し $data['xml']['kiji'][$i]['title'] = $item->title; //記事の日付 $pubDate = $date->date; $data['xml']['kiji'][$i]['pubDate'] = date("Y年m月d日 H:i:s", strtotime($pubDate)); //記事本文 $desc = $item->description; $data['xml']['kiji'][$i]['desc'] = $desc; $i++; //最大件数に達したときストップ if ($i == $max_lines) break; }

    • 締切済み
    • PHP
  • [PHP+XML]PHPで動的に出力するXMLをどのようにして読み込めばいいでしょうか?

    こんにちは、どうしても解決ができなくて困っています。 お助け願います。 DBからデータを取得し成形するなどした結果をXMLで出力できるようにPHPを用意しました。 ブラウザから確認でき、XMLをソース表示しても問題ありません。 次にこれを読み込むPHPを書いています。 simplexml_load_fileなどでXMLファイルを開くことはこれまでにもやっていたので、直接XMLファイル名を記述するところに用意したPHPを指定しました。 結果はエラー。 いろいろ検証した結果、PHPがアクションする前にPHPファイルが開かれてしまっている感じ。 DOMDocumentのload()やloadXML()で読み込む方法もトライしましたが結果は同じ・・・。 根本的に間違ってますか? PHPから吐き出されるXMLを読み込むためにXMLファイルを記述するところにPHPスクリプトを指定すること自体が間違っているようにも思っています。 お手数をお掛けいたしますがお教え願います。

    • ベストアンサー
    • PHP
  • XML::RSS文字コード統一の仕方がわかりません

    perl初心者です。 rssを取得して簡易ブログパーツをつくりたいのですが文字コードでうまいこといかず悪戦しています。 以下がコードです。(きたなくてすいません…) #!/usr/bin/perl use LWP::Simple; use XML::RSS; use utf8; use open ":utf8"; $logfile="./syoukai.log"; open(DAT, "$logfile"); @log=<DAT>; close(DAT); my $rss = new XML::RSS; @list = (); foreach(@log){ ($nom,$name,$prof,$xml,$btitle,$ktitle,$klink)=split(/<>/); eval { $rss->parse( LWP::Simple::get($xml) ); }; if($@) { next; } $btitle = $rss->{'channel'}->{'title'}; $prof = $rss->{'channel'}->{'link'}; $item = $rss->{'items'}; $line = @{$item}[0]; $ktitle = $line->{'title'}; $klink = $line->{'link'}; $date = $line->{'pubDate'}; push(@list, "$date<>$name<>$prof<>$xml<>$btitle<>$ktitle<>$klink<>\n"); } open(IN,">$logfile"); print IN @list; close(IN); exit; syoukai.logを呼び出して そこに書かれたxmlを順番に読み込んで ファイルを更新したいのですが これだと何もいじっていない$nameは大丈夫なんですが $btitleや$ktitleが文字化けしてファイルに書かれてしまいます…。 use utf8;ではなく use encoding 'UTF-8', STDOUT => 'cp932';としたら 今度は$nameだけ文字化けしてしまいます。 別々の文字コードを一緒にしてしまってるからだと思うのですが どれがどの文字コードなのかがわからないでいます。 文字コードを統一する方法などがあれば教えてくださいm(__)m 説明&記述ヘタですいません…。 宜しくお願いします。

  • simplexml_load_fileを使用してblogのRSSを読み

    simplexml_load_fileを使用してblogのRSSを読み込み、ページ内に表示させたいのですが 下記のスクリプトでは楽天とlivedoorのRSSの読み込みが出来ません。 色々検索してみたのですがこれといった解決法を発見できなかったので質問させていただきます。 どうぞよろしくお願いいたします。 <?php $xml = simplexml_load_file('RSSをここに入力'); $i = 0; foreach($xml->channel->item as $item) { if(++$i>5) break; $title = (string)$item->title ; $link = (string)$item->link ; echo ("<li><a href=".$link.">".$title."</a></li><br />"); } ?>

    • ベストアンサー
    • PHP
  • SimpleXMLでデータが取得できない

    PHPで、RSSのデータが上手く取得できず、困っております。 最初はSimplePieというフリーのライブラリを使用していたのですが、 一部のRSSのデータが全く取得できなかったので、使用を諦めました。 自分で処理を書こうと思い、以下の手順を踏んで RSSのデータを取得することを考えついたのですが、 それでもデータが取得できませんでした。 1.file_get_contents($url)で、RSSの生データを取得する 2.RSSの文字エンコーディングをUTF-8⇒SJIS⇒UTF-8に再変換 3.simplexml_load_stringでRSSをパース 最初は1と3の手順しか行っておらず、 SimplePieでデータが取得できたRSSはこれでも問題なかったのですが データが取得できなかったRSSで同じものを試すと 文字コードに関するエラーが出てきたので、2の処理を加えました。 文字コードのエラーは全て解消されたのですが、 それでもsimplexml_load_stringでデータがパースできず、 手詰まりになってしまっている状況です。 文字コードエラーが発生しているRSSでも、 xmlの文字列自体は正常に取得できているようなので simplexml_load_stringの段階で何かが失敗しているのだとは思うのですが、 全くエラーも表示されないため、何がダメなのかが分かりません。 どなたか、原因に心当たりがあったら 教えていただけないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP

専門家に質問してみよう