PHPでパーサを作る勉強を始めました。

主に下記サイトです。
http://www.geocities.jp/xmlfirststep/pxml/pxml_menu.html

このサイトの通り、
1.自分のローカルの環境(Apache2.2)
2.レンタルサーバ
http://1811way.com/work003/xmlpaser_sample1.php
でファイルを作成し実行しました。

上記1.では
あいうえお
XML error: Space required at line 3

上記2.では
あいうえお
XML error: not well-formed (invalid token) at line 2

とエラーが出てきます。

ソースは
http://1811way.com/work003/index.html
です。

xmlにスペースが必要、とのエラーのようですが、
わかりません。
ご存じであれば、
アドバイスいただけると助かります。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/05/19 21:29:18
  • 終了:2012/05/26 21:30:07

ベストアンサー

id:Cherenkov No.1

Cherenkov回答回数1503ベストアンサー獲得回数4932012/05/20 05:58:19

ポイント67pt

目的はなんですか?参考にされている情報が古いようですが。
PHP5のsimplexml_load_fileを使ったサンプルを書きました。utf-8で保存。

sensyu2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<list>
<選手 no="51">
	<氏名>
		<姓>鈴木</姓>
		<名>イチロー</名>
	</氏名>
	<守備>ライト</守備>
	<チーム>マリナーズ</チーム>
</選手>
<選手 no="3">
	<氏名>
		<姓>長嶋</姓>
		<名>茂雄</名>
	</氏名>
	<守備>三塁手</守備>
	<チーム>読売ジャイアンツ</チーム>
</選手>
</list>

xmlpaser_sample1.php

<?php
//header('Content-Type:text/html; charset=UTF-8');

function pr($var) {
	echo '<pre>'; print_r($var); echo '</pre>';
}

$filename = "sensyu2.xml";
$xml = simplexml_load_file($filename, 'SimpleXMLElement', LIBXML_NOCDATA);
foreach ($xml as $player) {
	//pr($player);
	echo "選手 [{$player->氏名->} {$player->氏名->}]<br>";
	echo " 守備 {$player->守備}<br>";
	echo " 所属 {$player->チーム}<br>";
	echo " 背番号 {$player->attributes()->no}<br>";
}
//pr($xml);

結果

選手 [鈴木 イチロー]
 守備 ライト
 所属 マリナーズ
 背番号 51
選手 [長嶋 茂雄]
 守備 三塁手
 所属 読売ジャイアンツ
 背番号 3

参考:PHP: simplexml_load_file - Manual

id:kohhi

いつもお返事ありがとうございます。
もういちど、まとめて、質問させていただきます。

2012/05/28 12:11:01

その他の回答(2件)

id:Cherenkov No.1

Cherenkov回答回数1503ベストアンサー獲得回数4932012/05/20 05:58:19ここでベストアンサー

ポイント67pt

目的はなんですか?参考にされている情報が古いようですが。
PHP5のsimplexml_load_fileを使ったサンプルを書きました。utf-8で保存。

sensyu2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<list>
<選手 no="51">
	<氏名>
		<姓>鈴木</姓>
		<名>イチロー</名>
	</氏名>
	<守備>ライト</守備>
	<チーム>マリナーズ</チーム>
</選手>
<選手 no="3">
	<氏名>
		<姓>長嶋</姓>
		<名>茂雄</名>
	</氏名>
	<守備>三塁手</守備>
	<チーム>読売ジャイアンツ</チーム>
</選手>
</list>

xmlpaser_sample1.php

<?php
//header('Content-Type:text/html; charset=UTF-8');

function pr($var) {
	echo '<pre>'; print_r($var); echo '</pre>';
}

$filename = "sensyu2.xml";
$xml = simplexml_load_file($filename, 'SimpleXMLElement', LIBXML_NOCDATA);
foreach ($xml as $player) {
	//pr($player);
	echo "選手 [{$player->氏名->} {$player->氏名->}]<br>";
	echo " 守備 {$player->守備}<br>";
	echo " 所属 {$player->チーム}<br>";
	echo " 背番号 {$player->attributes()->no}<br>";
}
//pr($xml);

結果

選手 [鈴木 イチロー]
 守備 ライト
 所属 マリナーズ
 背番号 51
選手 [長嶋 茂雄]
 守備 三塁手
 所属 読売ジャイアンツ
 背番号 3

参考:PHP: simplexml_load_file - Manual

id:kohhi

いつもお返事ありがとうございます。
もういちど、まとめて、質問させていただきます。

2012/05/28 12:11:01
id:pretaroe No.2

pretaroe回答回数531ベストアンサー獲得回数752012/05/20 13:20:46

ポイント67pt

XMLの中に漢字(日本語)を使わない同等のものを用いて
動作確認して見てください。

どうも漢字の扱いがうまくいっていないと思います。


PHPのバージョンにもよりますが
PHP5などでは、UTF-8の処理できますのでそちらを採用した方がよいでしょう。

id:kohhi

アドバイスありがとうございます。

2012/05/28 12:10:49
id:gizmo5 No.3

gizmo5回答回数484ベストアンサー獲得回数1382012/05/24 17:00:49

ポイント66pt

質問のリンク先のソースを見ました。
XML 宣言が化けているのは、ご愛嬌として、XML の体裁が整っていません。
XML 宣言が最初に来て、次には、唯一のルートノードが無くてはいけません。
9行目は、</選手> となってなくちゃいけなくて、
10行目、11行目は、付けちゃいけません。

一番目の人のサンプルのように、選手データを複数持たせたければ、
その外側を唯一のノード(タグ)でくくってあげる必要があります。

後、PHP のソースで、102行目の文字コード変換がいけません。
文字コードは、XML 宣言の charset になってる必要があります。
宣言で charset が UTF-8 になっているのに、文字コードだけ変換しては、パースエラーになります。

id:kohhi

さっそくお返事ありがとうございます。
ご指摘、大変参考になりました。

2012/05/28 12:10:55

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません