XMLデータはsample.xmlという名称で保存していると仮定してます。
<?xml version="1.0" encoding="UTF-8"?>
<aaa age_limit="LL">
<rank point="0.40000" order="1"> <team area3="青葉区" area2="横浜市" area1="神奈川県" email="" url="" name="ZZZZ" id="123456"/>
</rank>
</aaa>
読み込みたい箇所は
age_limit
order
area3
area2
area1
id
です。
よろしくお願い致します。
SimpleXML を使う方法です。PHP5 では標準で使えるようになっていると思います。
<?php $aaa = new SimpleXMLElement('./sample.xml', NULL, true); $age_limit = $aaa['age_limit']; $order = $aaa->rank['order']; $team = $aaa->rank->team; $area3 = $team['area3']; $area2 = $team['area2']; $area1 = $team['area1']; $id = $team['id']; # LL, 1, 青葉区, 横浜市, 神奈川県, 123456 echo "{$age_limit}, {$order}, {$area3}, {$area2}, {$area1}, {$id}"; exit; ?>
以下コメントを受けての追記です。(2011.6.21 20:00 修正しました。)
何故か XML のデータがどこかで Shift_JIS に変換されているようです。
ファイルを直に読み込むのではなく、一旦文字列として読み込んで、念のため UTF-8 に変換してからその文字列を与える形にしてみました。
また、複数の <rank> の値を取得するように変更しています。
<?php # 下二行はエラー表示用なので表示に成功したら削っても構いません ini_set('display_errors', 'On'); error_reporting(E_ALL); $xml_str = file_get_contents('./sample.xml'); # 文字コードを UTF-8 に $xml_str = mb_convert_encoding($xml_str, 'UTF-8', 'auto'); $aaa = new SimpleXMLElement($xml_str); $age_limit = $aaa['age_limit']; echo "{$age_limit}\n"; # <rank> ごとの内容を表示 foreach ($aaa->rank as $rank) { $order = $rank['order']; $area3 = $rank->team['area3']; $area2 = $rank->team['area2']; $area1 = $rank->team['area1']; $id = $rank->team['id']; echo "{$order}, {$area3}, {$area2}, {$area1}, {$id}\n"; } # id だけ取ってきて配列に格納 # order なら '/aaa/rank/@order' になります # area3 なら '/aaa/rank/team/@area3' になります $id_list = $aaa->xpath('/aaa/rank/team/@id'); # 配列の内容を表示 foreach ($id_list as $id) { echo "{$id}, "; } exit; ?>
もし、これでも駄目でしたら、ちょっと大仰になってしまいますが DOMDocument を使うという方法もあります。(こちらも文字コードを変換して読み込むよう修正しました。)
<?php ini_set('display_errors', 'On'); error_reporting(E_ALL); $xml_str = file_get_contents('./sample.xml'); $xml_str = mb_convert_encoding($xml_str, 'UTF-8', 'auto'); $doc = new DOMDocument('1.0', 'UTF-8'); $doc->loadXML($xml_str, LIBXML_NOBLANKS); $xpath = new DOMXpath($doc); $age_limit = $xpath->query('/aaa/@age_limit'); echo $age_limit->item(0)->nodeValue . "\n"; $rank_items = $xpath->query('/aaa/rank'); foreach ($rank_items as $rank) { $order = $rank->getAttribute('order'); $area3 = $rank->firstChild->getAttribute('area3'); $area2 = $rank->firstChild->getAttribute('area2'); $area1 = $rank->firstChild->getAttribute('area1'); $id = $rank->firstChild->getAttribute('id'); echo "{$order}, {$area3}, {$area2}, {$area1}, {$id}\n"; } exit; ?>
ただ、SimpleXML も DOMDocument も処理する本体の部分は同じ (libxml 拡張モジュール) なので、その本体の部分でエラーが出ている場合はあまり意味は無いかもしれません。
ありがとうございます頂いた情報ではうまく表示できませんでした。
php5です。
<rank point~>////</rank>までが複数あったので
xml内のデータを変えてみても表示できません。
何が悪いのでしょうか??