人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpで以下のXMLデータを読み込む方法を教えてください。
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
です。
よろしくお願い致します。

●質問者: vfr6822
●カテゴリ:ウェブ制作
✍キーワード:PHP XML データ 名称
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● ぱこち
●100ポイント ベストアンサー

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内のデータを変えてみても表示できません。

何が悪いのでしょうか??

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ