サンプルを作ってみました。
想定する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";
}
?>
----------------------------------------------------------
最後の出力でわかるように、それぞれの選手データを配列に格納していきます。
そのようにしているので、登録した番号で、まとめて選手データを扱えます。
選手の名前や、背番号をキーにすることもできますが、重複する可能性があると思ったので、単純に出現した順番に番号を振っています。
お礼
ありがとうございます!(o^□^o)♪ でも、コピぺしたらError at Reading xmlって出ました。(>_<)