XML の中で & 記号はエスケープしなければ simplexml_load_string() でエラーになる

以下のような XML をオブジェクトとして代入しようとしました。

1
2
3
4
5
6
7
8
<?xml version='1.0' encoding='UTF-8'?>
<test>
	<item>
		<id>100</id>
		<name>テスト&テスト</name>
		<date>2011-06-01 18:27:36</date>
	</item>
</test>

しかしなぜか以下のようなエラーが出て simplexml_load_string() でオブジェクトとして代入することができません。

Warning (2): simplexml_load_string() [http://php.net/function.simplexml-load-string]: Entity: line 17: parser error : EntityRef: expecting ‘;’ [APP/views/calorie/calorie.ctp, line 53]

調べてみたところ以下の問題に該当していたようです。

XML Parsing Error: EntityRef: expecting ‘;’ URLのパラメータの区切りによく使われる”&”など半角記号は、XHTMLでは直接使ってはいけない。例えば ” (ダブルクォーテーション)は " と、「& とアルファベットと ; 」で表現するみたい。つまり & を使うと「& とアルファベットと ; 」と勘違いして、「& を使ってるくせに ; がねえぞ!ゴルァ!」とお怒りになるわけ。なので、& は & に置き換える。

ということは XML を生成する時は htmlspecialchars() を通してエスケープ処理をしておくと良さそうです。

1
htmlspecialchars('テスト&テスト');

結果以下のような XML となりオブジェクトとして代入することができます。

1
2
3
4
5
6
7
8
<?xml version='1.0' encoding='UTF-8'?>
<test>
	<item>
		<id>100</id>
		<name>テスト&ampテスト</name>
		<date>2011-06-01 18:27:36</date>
	</item>
</test>

コメント

コメントは受け付けていません。