Studying XML -- second step -- 更新情報へStudying XML -- second step --

Menu

- 文字集合
- 「名前」
- 文字符号化方式
- DTD
- 要素型宣言
- 内容モデル (1)
- 内容モデル (2)
- 属性リスト宣言
- 属性の型 (1)
- 属性の型 (2)
- デフォルト値
- 条件付きセクション
- DTDの簡単な例
- 文字参照
- エンティティ
- エンティティの分類
- エンティティ参照
- エンティティ宣言
- 解析対象エンティティ
- notation
- エンティティの使用例
- エスケープ
- 属性値の正規化
- スタンドアロン宣言
- サブセット

このページへのご意見ご感想などお待ちしています(ps8a-okzk@asahi-net.or.jp)
Escaping


 例えば要素内容として<test>という文字データを記述しようとしても、 XMLプロセッサはこれをtestという要素の開始タグであると解釈し、 おそらく「要素testに対する終了タグがない」とエラーを出すでしょう。

 XML文書では、特定の文字に特別な意味を与えていて、 例えば要素の中で現れる<という文字には"タグの始まり"という意味が与えられています。


 特別な意味を持っていてそのまま使うことができない文字は、 文字参照&lt;などのエンティティ参照を使えば表すことができます。 これを、エスケープ(escape)すると言います。

 文字参照を使う場合には、該当するコード番号で参照します。

 エンティティ参照を使う場合、 <&lt;で、 >&gt;で、 &&amp;で、 '&apos;で、 "&quot;で、表します。


 どの文字に特別な意味が割り当てられているかは、場所によって異なります。

 コメントと処理命令とCDATAセクション以外の場所では、 &<の文字をそのまま使うことができません。

 例えば<test>という文字列を要素内容に文字データとして含めたい場合、 &lt;test>または&lt;test&gt;と記述すれば、 要素testの開始タグとして解釈されずにすみます。

 属性値の中ではさらに、 値が"で囲まれる場合には属性値の中に現れる"を エスケープする必要があり、 値が'で囲まれる場合には属性値の中に現れる'を エスケープする必要があります。

 例えばMacDonald'sを属性値にしたい場合、 name='MacDonald's'とするとエラーになります。 name="MacDonald's"こうするのが最も簡単ですが、 name='MacDonald&apos;s'とすることもできます。

 処理命令の内容として現れる?>という文字列もエスケープする必要があります。

 エンティティ宣言で指定されるエンティティの値の中では、 %&をエスケープする必要があり、 さらにその宣言で値が"で囲まれる場合には"を、 その宣言で値が'で囲まれる場合には'を、 エスケープする必要があります。

 CDATAセクションは、 <&をエスケープしなくてよい場所ですが、 ]]>という文字列が含まれる場合には ]]&gt;のようにエスケープする必要があります。


 通常、エンティティを使うためには、 エンティティ宣言をしなくてはならないのですが、 validかどうかをチェックされずwell-formedかどうかだけをチェックされる時には、 lt, gt, amp, apos, quot という5つのエンティティは宣言なして使うことができます。

 validかどうかチェックされる場合には、 これらのエンティティにも宣言があることが望ましいとされています。 宣言する場合には、以下のように宣言されなければなりません。

<!ENTITY lt "&#38;#60;">

<!ENTITY gt "&#62;">

<!ENTITY amp "&#38;#38;">

<!ENTITY apos "&#39;">

<!ENTITY quot "&#34;">


まとめ
特別な意味が与えられた文字をそのままデータに含めたい場合、 エンティティ参照か文字参照を使ってエスケープする必要があります。

(エンティティの使用例) <--BACKUP↑ (Studying XML -- second step -- 更新情報)NEXT--> (属性値の正規化)