PHPでXMLファイルを読み込む方法とは?

このQ&Aのポイント
  • PHPを使ってxmlファイルを読み込んだり、データを取得する方法について解説します。
  • 自作のxmlファイルをsimplexml_load_file()で読み込む際に発生する問題や対策について説明します。
  • PHPでxmlファイルを作成する方法についてもご紹介します。
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • 4017B
  • ベストアンサー率73% (1302/1773)
回答No.1

確定できないけど、一番疑わしいのは単純に自作XMLが、標準のXML書式の作法に則ってないからでは無いかな…? phpで扱うテキストは種類を問わず、問答無用で全て「UTF8、BOM無し、改行LF」にする。コレが鉄則です。それ以外ではそもそもphp上では動作保証されてません。外部ファイルを読み込む時も同様です。 >日本語が表示出来ない 具体的に。「日本語が表示されない」なのか、それとも「日本語が読めない(文字化け)」なのか??トラブル、即ち自分の置かれた環境や問題点を、第三者にも正しく理解出来る様に言語化出来るかどうか。これはphp等のプログラミング能力とも比例関係にあります。 ・日本語が表示されない→XML内のデータ自体を読み取れて無い可能性。 ・日本語が読めない(文字化け)→文字コード改行が正しく処理されてない。 正しく作法に則って作られたXMLなら、日本語が含まれていても問題無くphp内でも処理されます。またphpでXMLファイルを書き出す専門プログラムという物はありません。XML自体、ただの標準書式に則って作成されるただの「テキストファイル」に過ぎません。 従ってXMLに特化した関数などは無く。単純に元からある fopen や fwrite などの標準関数を組み合わせて、テキストファイルとして書き出したファイルに、後から人為的に拡張子等を付けて「XMLファイル」などと呼んでるに過ぎません。テキストデータを出力する時に、XMLの書式に則って書き出せばXMLとなり。HTMLの書式に則って書き出せばHTMLとなるだけの話です。 従って作者自身が既に「XMLの書式やルールに精通している」事が大前提になります。 …とは言いつつも、phpには様々なライブラリが配布公開されてます。"SimpleXML" もその1つですね。なので "SimpleXML" を徹底的に使い倒せば、色んな事が可能になります。「php xml 書き出し」などで検索すれば、色々なサンプルや作成事例が出て来ると思います。 P.S. 最近はver.によって書式がブレるXMLは捨てて、テキストデータは全て「JSON形式」にしていこう!~と言うのが流行りの様です。自分も基本的にはXMLよりもJSONの方が加工し易いかなあと思います(同じデータをローカルからJavascriptでも使えるし)。元々、XML自体が「人間に分かり易いデータ形式」と言うものだったので。可読性を重視すれば、その分プログラム側には難読性が増してしまう仕様は避けられない運命だったのかも…?

newtgecko
質問者

お礼

分かりやすく説明していただきありがとうございます! UTF8、BOM無し、改行:LFのみ(Unix)で試して見たいのですが、エラーが返ってきました(いろいろ試した時にも出ました)。 Warning: simplexml_load_file(): I/O warning : failed to load external entity "test.php" in C:\xampp\htdocs\index.php on line 44 Notice: Trying to get property of non-object in C:\xampp\htdocs\index.php on line 45 44、45行目は以下のコードです。 $xml = simplexml_load_file("test.php"); echo $xml->item[0]; 「php xml 書き出し」で調べてみます。xmlはプログラムが作成するものしか、読み込まないので、プログラムに作成させたほうが都合がいいです。 JSON形式への流れがあるという現在の傾向まで教えていただき感謝です。今はXMLを使ってみたいので、XMLでお願いします。(XMLの難読さを体験してからのほうがJSON形式の素晴らしさがわかる可能性もありますし。)

newtgecko
質問者

補足

質問に補足です。Yahoo!のXMLを読み取るプログラムは $url = "http://rss.weather.yahoo.co.jp/rss/days/5710.xml"; $rss = simplexml_load_file($url); echo $rss->channel->item->title; でした。echoをするのを忘れていました。出力は「【 25日(金) 嶺北(福井) 】 晴れ - 23℃/8℃ - Yahoo!天気・災害」です。

関連するQ&A

  • 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
  • PHP5のsimplexml_load_fileで取得した結果をファイルに書き込みたい

    よろしくお願いします。 PHP5でSimpleXMLを利用して得られた結果をファイルに書き込む、つまりキャッシュを保存したいのですが、以下のようにやっても作成されるファイルは空のままです。ディレクトリモードは755です。 $url = "http://hoge.co.jp/index.php?a=123"; $cache_file = md5($url); $xml = simplexml_load_file($url); $fp = fopen($cache_file, 'w'); fwrite ($fp, $xml); fclose($fp); どうかご教授よろしくお願いします。

    • 締切済み
    • PHP
  • XMLのロードに失敗する

    PHP5においてsimplexml_load_fileを使って、様々なサイトのRSS(XML)を読み込もうとしています。 一部のサイトに対してFalseが返ってきます。いまいちコンディションが掴みきれておらず うまくいくことうまくいかないことを記述させていただきます。 PHP設置環境の種類 ローカルサイト上のLinux、レンタルサーバA、レンタルサーバB、レンタルサーバC ターゲットRSS NHK http://www3.nhk.or.jp/rss/news/cat0.xml はてな http://feeds.feedburner.com/hatena/b/hotentry 毎日新聞 http://mainichi.jp/rss/etc/flash.rss 問題となるのは毎日新聞です。環境によって読めたり読めなかったりします。 ローカルでの結果 NHK、はてな、毎日新聞 いずれもOK レンタルサーバA 毎日だけNG レンタルサーバB すべてOK レンタルサーバC 毎日だけNG 今回はこのサーバAやCの問題をクリアしたいのですが方法がわかりません。 simplexml_load_fileがNHKやはてなに対して動作するのに毎日に対してのみ動かないという 観点からすると毎日側の仕様の影響かとも思うのですが、 PHPの設置環境によって動作が変わるという観点も加味すると PHPの設置環境の何かに依存し、読み込み対象が絞られる、というようなイメージを持っています。 いずれも無料サーバということもあり、検討ぐらいつけてから管理人に相談させていただくのが 良いかと思いこの場をお借りしております。 なお、レンタルサーバCは.land.toです。 よろしくお願いいたします。 エラー文 $data = simplexml_load_file($rss); if ($data == FALSE){ echo "Failed loading XML<br>\n"; foreach(libxml_get_errors() as $error) {echo "\t", $simplexml_load_fileerror->message;}//Failed loading XML was the returned error } Warning: simplexml_load_file(http://rss.yomiuri.co.jp) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /home/httpd/****/public_html/php/rss.php on line 9 Failed loading XML failed to load external entity "http://rss.yomiuri.co.jp" なお、rss.phpのline 9は $data = simplexml_load_file($rss);です。

    • ベストアンサー
    • PHP
  • 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
  • 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
  • [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
  • simplexml_load_file() のかわりの simplexml_load_string() がエラーになる

    こんにちわ。 お時間あるかた、どうぞよろしくおねがいします。 現在、RSSを読み込んで、色々な処理をしたいと思っています。 そして、下記のコードを書いたところうまくいきました。 $root = simplexml_load_file($url); ところが、使っているレンタルサーバでは PHP.iniのallow_url_fopenをONにすることが禁止されていることを知ったので、 simplexml_load_string()を使うように、プログラムを書き換えました。(下記抜粋) $response = http($url . $parm); $line = explode("\n" , $response); // HTTPヘッダを消す for ( $i=0 ; $i < 100 ; $i++ ) if ( $line[$i] == "" ) break; // HTTPボディーだけ取得 $xml_str = ""; for ( $i++ ; $i < count($line) ; $i++ ) $xml_str .= $line[$i]; $root = simplexml_load_string($xml_str); こうしたところ、一部のRSSで、Error while parsing the documentが出るようになってしまいました。 いくつか試したところ、amebloのフィードはOKなのですが、他のRSSだとエラーになるようです。 $ret = get_rss("http://feedblog.ameba.jp/rss/ameblo/femiohji"); // OK $ret = get_rss("http://pub.ne.jp/marunohi/?action=rss&type=rss1.0"); // NG というわけで、 simplexml_load_file()のときは動いていたのですが、 simplexml_load_string()にしたらエラーになります。 原因がわからず、行き詰まってしまいました。 よろしくおねがいいたします。

    • ベストアンサー
    • PHP
  • simplexml_load_fileでのXML

    simplexml_load_fileを使ってXML形式のデータを処理したいのですが、 <YDF xmlns="http://olp.yahooapis.jp/ydf/1.0" firstResultPosition="1" totalResultsAvailable="1" totalResultsReturned="1"> <ResultInfo> <Count>1</Count> <Total>1</Total> </ResultInfo> <Feature> <Id>201210191610_139.73229_35.663613</Id> <Geometry> <Type>point</Type> <Coordinates>139.73229,35.663613</Coordinates> </Geometry> <Property> <WeatherAreaCode>4410</WeatherAreaCode> <WeatherList> <Weather> <Type>observation</Type> <Date>201210191610</Date> <Rainfall>1.65</Rainfall> </Weather> <Weather> <Type>forecast</Type> <Date>201210191620</Date> <Rainfall>0.00</Rainfall> </Weather> <Weather> <Type>forecast</Type> <Date>201210191630</Date> <Rainfall>0.00</Rainfall> </Weather> </WeatherList> </Property> </Feature> </YDF> $xml = simplexml_load_file(リクエストURL); 上記のレスポンスが返ってきたとして、2番めのDateを取得しようとした場合 $xml->Feature->Property->WeatherList->Weather[1]->Date; では表示する事が出来ませんでした。 なにが原因でしょうか?

    • 締切済み
    • PHP
  • wordpress上でxmlが読み込めない

    <?php $fileName="http://~~~/jouhou.xml"; if(file_exists($fileName)){ $xml=simplexml_load_file($fileName); }else{ echo "失敗しました。"; } ?> 上記の式を、Wordpress内に設置したphp上で実行したのですが、失敗しか表示してくれません。 環境がセーフモードでないことは確認していて、xmlファイル自体もきちんと該当URLに存在を確認できるのに、なぜ読み込めないのでしょうか? PHP Version 5.1.6 WordPress 3.1.1(自分でインストール) 該当環境にはベーシック認証がかかっています。

    • 締切済み
    • PHP
  • PHPでプロキシ経由で外部にアクセスするには?

    PHPで外部サーバのXMLを取得してなんらかの処理を行う場合、SimpleXMLのsimplexml_load_file()を利用してXMLをとってくるという方法があると思いますが、 PHPを動かすPCがたとえば会社のイントラに接続されていて、インターネットにあるXML(たとえばRSSなど)を取得する場合に、プロキシを経由する必要がある場合、どのように設定(あるいはコーディング)すればよろしいのでしょうか? OSはLinux系でもWindows系でもどちらでもかまいません。 よろしくお願いします。

    • 締切済み
    • PHP