PHPでXMLデータを取得する方法とは?

このQ&Aのポイント
  • XMLデータをPHPで取得する方法について解説します
  • 選手単位でXMLデータの内容を取り出す方法を紹介します
  • データの追加や更新についても解説します
回答を見る
  • ベストアンサー

php で xml

xmlのデータをphpで取り出したいのですが、こういうような形でデータを追加していけるphpのサンプルなどはないでしょうか? <選手 no="51"> <姓>鈴木</姓> <名>イチロー</名> <守備>ライト</守備> </選手> <選手 no="52"> <姓>高木</姓> <名>キチロー</名> <守備>レフト</守備> </選手> できれば、選手単位(姓が高木なら高木選手の姓、名、守備を取り出すような)で内容を取り出したいです。 http://www18.tok2.com/home/koumori27/xml/pxml/pxml2.htmlのサンプルではデータを追加すると下のようになってしまいますし、選手単位では取り出せません。 <選手 no="51"> <姓>鈴木</姓> <名>イチロー</名> <守備>ライト</守備> <姓>高木</姓> <名>キチロー</名> <守備>レフト</守備> </選手>   

  • PHP
  • 回答数3
  • ありがとう数4

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

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

サンプルを作ってみました。 想定するXMLファイル(data.xml) <?xml version="1.0" encoding="UTF-8" ?> <選手リスト> <選手 no="51"> <姓>鈴木</姓> <名>イチロー</名> <守備>ライト</守備> </選手> <選手 no="52"> <姓>高木</姓> <名>キチロー</名> <守備>レフト</守備> </選手> </選手リスト> ------------------------------------------- <?php function default_handler($parser, $node){ return ; } function start_element_handler($parser, $name, $attr){ global $el, $Buffer, $Counter; $el=mb_convert_encoding($name, "SHIFT_JIS","UTF-8"); switch($el){ case "選手": $no=mb_convert_encoding($attr["no"], "SHIFT_JIS","UTF-8"); $Buffer[$Counter]["no"]=$no; break; case "姓": case "名": case "守備": break; default: $el=""; #その他(ルートエレメントとか)は無視 } } function end_element_handler($parser, $name){ global $el, $Counter; $el=mb_convert_encoding($name, "SHIFT_JIS","UTF-8"); if($el=="選手"){ $Counter++; } $el=""; } function character_data_handler($parser, $text){ global $el, $Buffer, $Counter; if($el!=""){ $Buffer[$Counter][$el]=mb_convert_encoding($text, "SHIFT_JIS","UTF-8"); } } $Buffer = array(); $Counter = 0; $el=""; #現在処理中のエレメント $parser = xml_parser_create("UTF-8"); if(!$parser){ print "failer XML Parser create"; exit ; } xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);#大文字に変換しない xml_set_default_handler($parser, "default_handler"); xml_set_element_handler($parser, "start_element_handler","end_element_handler"); xml_set_character_data_handler($parser, "character_data_handler"); $fp=fopen("data.xml","r"); while($fin = fread($fp, 4096)){ if(!xml_parse($parser, $fin, feof($fp))){ print "Error at Reading xml"; break; } } fclose($fp); xml_parser_free($parser); #出力 for($i=0;$i<$Counter;$i++){ print "背番号:" . $Buffer[$i]["no"] . "\n"; print "  姓:" . $Buffer[$i]["姓"] . "\n"; print "  名:" . $Buffer[$i]["名"] . "\n"; print " 守備:" . $Buffer[$i]["守備"] . "\n\n"; } ?> ---------------------------------------------------------- 最後の出力でわかるように、それぞれの選手データを配列に格納していきます。 そのようにしているので、登録した番号で、まとめて選手データを扱えます。 選手の名前や、背番号をキーにすることもできますが、重複する可能性があると思ったので、単純に出現した順番に番号を振っています。

bavarois
質問者

お礼

ありがとうございます!(o^□^o)♪ でも、コピぺしたらError at Reading xmlって出ました。(>_<)

その他の回答 (2)

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

>いろいろな文字コードを試してみます。 XPを使っているなら、ノートパッド(メモ帳)にコピペして 名前を付けて保存から文字コードUTF-8で保存するのが簡単

bavarois
質問者

お礼

うわわわわわーーっ!!キタ━━(o^□^o)━━♪☆♪ いろんなことを試してもずっとできなかったのに、「ノートパッド(メモ帳)にコピペして名前を付けて保存から文字コードUTF-8で保存」したらできました!! ありがとうございます!!(。・w・)b

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

>Error at Reading xmlって出ました。(>_<) xmlのデータ部分は、#1のヤツを使っているんですか? それとも別のデータでしょうか #1を使っていて問題になるとしたら文字コードですかね #1では、データ部分はUTF-8で作成していることを想定してます。 EUC-JPならそのように変更して下さい。 ><?xml version="1.0" encoding="UTF-8" ?> の部分とか >$parser = xml_parser_create("UTF-8"); の部分とか >mb_convert_encoding($name, "SHIFT_JIS","UTF-8"); のような諸々の部分

bavarois
質問者

お礼

回答ありがとうございます。 xmlのデータ部分は、#1のヤツです。 いろいろな文字コードを試してみます。 ありがとうございました。

関連するQ&A

  • XMLデータをcsvに変換

    初心者で困っています。 XMLデータをcsvに変換したいのです。よくある質問ですが、よくわからなくて困っています。PHP5でSimpleXML関数を使えばいいという話はよく載っていますが、私のやりたい事は以下の通りです。 1. XMLデータが存在します。 2. 構造体はコロコロと変わります。 3. 親ノード(表現あっているかわかりませんが)含めcsvで全て表示したいと思っています。 例えば(他の方の質問サンプルを拝借) <チーム no="82"> <選手 no="51"> <姓>鈴木</姓> <名>イチロー</名> <守備>ライト</守備> </選手> <選手 no="52"> <姓>高木</姓> <名>キチロー</名> <守備>レフト</守備> </選手> </チーム> を チームno,選手 no,姓,名,守備 82,51,鈴木,イチロー,ライト 82,52,高木,キチロー,レフト とcsvで出力したいのです。 また、構造体や名前は変わるのでこのように全ての項目について出力するにはどうしたらいいのでしょうか? ご存知の方、ご教授ください。

    • ベストアンサー
    • 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

    今契約してるサーバーがSQLをつけるとものすごい金額になってしまうので。XMLに挑戦中です。 作ってみたのですが、ソースが間違ってる?のか表示できません、教えてください. name.xml <?xml version="1.0" encoding="shift-jis"?> <test no="1"> <name>test</name> <no>10</no> <tel>123-456-789</tel> </test> test.php <html> <head> <title>sample1</title> </head> <body> <?php $doc->load("name.xml"); $name = $doc->selectSingleNode("test"); $list = $name->selectNodes("*"); $no = $list->item(1); $text = " 番号 " . $no . "<br>"; print $text; ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHP ”XML_unserialize”でXMLを配列に変換したのですが・・・

    XMLファイルを配列としてとってこれる XML_unserializeというライブラリを使用して XMLファイルに含まれるデータをとってPHPで利用することが できたのですが、ここで一つ大きな問題が発生しました。 XML_unserializeをつかうと <XMLTAG>  取り出したいデータ </XMLTAG>      ↓ array(  [XMLTAG] = 取り出したいデータ ) と、たしかに取り出したいデータを配列に変換することができます。 しかし、取り出したいデータの中にタグが含まれていた場合 例えば <XMLTAG>  <div>取り出したいデータ</div> </XMLTAG> とかになっていると <div>もXMLと判断されてしまって 必要なデータがうまくとってこれないのです。 正規表現でエスケープさせるにしても数が膨大ですし、 XMLタグ名に実際にHTMLで使われている タグ名が使われているとも限りません。 どうすれば、 ”XMLの中に入っているHTML等のタグを含むデータ”をうまくとってくることが できるのでしょうか?

    • ベストアンサー
    • PHP
  • XMLを動的に読む

    ワードプレスなどで行われているPHP⇔MYSQLのような動きを、javascript⇔XMLでやりたいです。 具体的に言うと、 index.htmlでボタンAを押されるとdata.xmlのA情報がindex.htmlに表示される index.htmlでボタンBを押されるとdata.xmlのB情報がindex.htmlに表示される というものです。 Ajaxなど調べているのですが、なかなかいい情報が見つかりません。 てってきたいのはテキスト情報だけですので、なるべくシンプルで簡単なコードが知りたいのですが、複雑な部分が多くて困っています。 簡単なやり方が紹介されているサイトや簡単なサンプルを見せてもらえるととても助かります。

  • 外野手の守備能力

    一般的には、ライトが強肩好守、センターが俊足好守の選手が守っていますが、レフトは他の外野手より守備能力が劣る人が守ることが多いですよね?(レフトばかり守る選手としては、ラミレスや和田など) センターの守備能力が必要なのは分かります。打球が飛んでくる回数はライトもレフトもそんなに変わらないはずなのに、どうして守備が上手な選手のほうをライトに配置するのでしょうか?逆にいうと、どうして守備に難があるほうがレフトなのでしょうか?

  • PEAR XML_Query2XMLを利用したPHPからFlash(AS3)へのXMLデータの渡し方について。

    毎度お世話になっております。 前回させていただいた質問で、PHPからFlashへのデータ受け渡しをしたいと考えていたところ、XML形式がいいと教えていただき、試していました。 FlashのただのXMLファイルの読み込みはでき、PHPのPEAR XML_Query2XMLを利用してデータベースのデータをXMLに整形することも出来ました。 しかし、その後の連結的な操作が分からず戸惑っております。 お時間があるときでよろしいので、何を使ったらよいかなどアドバイス等を頂ければと思います。 よろしくお願いします。 環境 Flash CS3(AS3) PHP5.2.6 MySQL5.1.29 Apache2.2.10 ・PHPの今のところのプログラム <?php // include required files include 'XML/Query2XML.php'; include 'MDB2.php'; try { // initialize Query2XML object $q2x = XML_Query2XML::factory(MDB2::factory('mysql://ユーザ名:パスワード@localhost/データベース名')); // generate SQL query // get results as XML $sql = "SELECT * FROM table名"; $xml = $q2x->getFlatXML($sql); // send output to browser header('Content-Type: text/xml'); $xml->formatOutput = true; echo $xml->saveXML(); } catch (Exception $e) { echo $e->getMessage(); } ?> ・AS3の今のところのプログラム System.useCodePage = true; // 外部XMLはURLLoaderで読み込む var myLoader:URLLoader = new URLLoader(); myLoader.addEventListener(Event.COMPLETE, completeData); myLoader.load(new URLRequest("test.xml")); // 読み込み完了後の処理 function completeData(event:Event):void { // 読み込んだ文字列をmyXMLに入れる var myXML:XML = new XML(myLoader.data); // データのnameとpriceの値をリストアップ表示 trace(myXML.drink[1].name); for (var i = 0; i < myXML.drink.length(); i++) {; //ダイナミックテキストでi番目を表示 db.text = myXML.drink[i].name trace(myXML.drink[i].name); trace(myXML.drink[i].@price); } } よろしくお願いします^^

    • ベストアンサー
    • PHP
  • XMLデータをPOSTで送信・受信する方法

    PHP初心者です。 以下のようなXMLのデータをPOSTで送信、送信されてきたXMLデータを受信する方法がわからず行き詰っています。 フォームで以下のXMLデータをtest.phpに送ってみようと試しているのですが、valueにXMLのデータをどのようにセットすればいいのかわかりません。 そもそもこの方法が合っているのかどうかも自信がない状態です。 仕事の関係でどうしても今週中に仕上げなければならず、 大変困っています。 どなたかアドバイスをください。 よろしくお願いします。 <form action="test.php" method="post">   <input type="hidden" name="xmldata" value="">   <input type="submit" value="送信"> </form> 【test.xml】 <?xml version="1.0" encoding="UTF-8"?> <test> <sample01>あいうえお</sample01> <sample02>かきくけこ</sample02> </test>

    • 締切済み
    • PHP

専門家に質問してみよう