アプリ版:「スタンプのみでお礼する」機能のリリースについて

xmlのデータをphpで取り出したいのですが、こういうような形でデータを追加していけるphpのサンプルなどはないでしょうか?
<選手 no="51">
<姓>鈴木</姓>
<名>イチロー</名>
<守備>ライト</守備>
</選手>
<選手 no="52">
<姓>高木</姓>
<名>キチロー</名>
<守備>レフト</守備>
</選手>

できれば、選手単位(姓が高木なら高木選手の姓、名、守備を取り出すような)で内容を取り出したいです。

http://www18.tok2.com/home/koumori27/xml/pxml/px …のサンプルではデータを追加すると下のようになってしまいますし、選手単位では取り出せません。
<選手 no="51">
<姓>鈴木</姓>
<名>イチロー</名>
<守備>ライト</守備>

<姓>高木</姓>
<名>キチロー</名>
<守備>レフト</守備>
</選手>
  

A 回答 (3件)

サンプルを作ってみました。


想定する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";
}
?>
----------------------------------------------------------
最後の出力でわかるように、それぞれの選手データを配列に格納していきます。
そのようにしているので、登録した番号で、まとめて選手データを扱えます。
選手の名前や、背番号をキーにすることもできますが、重複する可能性があると思ったので、単純に出現した順番に番号を振っています。
    • good
    • 0
この回答へのお礼

ありがとうございます!(o^□^o)♪

でも、コピぺしたらError at Reading xmlって出ました。(>_<)

お礼日時:2005/09/23 15:49

>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");
のような諸々の部分
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
xmlのデータ部分は、#1のヤツです。

いろいろな文字コードを試してみます。
ありがとうございました。

お礼日時:2005/09/24 13:45

>いろいろな文字コードを試してみます。


XPを使っているなら、ノートパッド(メモ帳)にコピペして
名前を付けて保存から文字コードUTF-8で保存するのが簡単
    • good
    • 0
この回答へのお礼

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

ありがとうございます!!(。・w・)b

お礼日時:2005/09/25 16:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!