知識ベース

CDATA

文字データを意味するCDATAという用語は、マークアップ言語SGMLおよびXMLで、明確ではあるが関連する目的で使用されます。この用語は、文書の特定の部分が、非文字データまたはより具体的で制限された構造を持つ文字データではなく、一般的な文字データであることを示します。

XMLのCDATAセクション

XMLドキュメントまたは外部エンティティでは、 CDATAセクションは、マークアップされたコンテンツとしてではなく、テキストデータとして文字通り解釈されるようにマークアップされた要素コンテンツです。 CDATAセクションは、文字データを表現するための代替構文にすぎません。 CDATAセクションの文字データと標準構文の文字データの間に意味的な違いはありません。たとえば、「」と「&」は「<」で表されます。それぞれ「&」。

構文と解釈

CDATAセクションは、次のシーケンスで始まります。

!CDATA

そして、シーケンスの次の出現で終了します。

CDATA sender> John Smith / sender>

XMLドキュメントの新しい作成者は、CDATAセクションの目的を誤解することが多く、その目的は、処理中にデータが通常の文字データとして扱われるのを「保護」することであると誤解しています。 XMLドキュメントを操作するための一部のAPIは、CDATAセクションへの独立したアクセスのオプションを提供しますが、そのようなオプションはXML処理システムの通常の要件を超えて存在し、データの暗黙的な意味を変更しません。文字データは、CDATAセクションまたは通常のマークアップのどちらで表現されるかに関係なく、文字データです。 CDATAセクションは、XMLドキュメント内のテキストデータとしてXMLコードを記述するのに役立ちます。たとえば、XMLアプリケーションの使用を説明するXSLで本をタイプセットしたい場合、本自体に表示されるXMLマークアップはCDATAセクションのソースファイルに書き込まれます。

NestingeditCDATACDATA> CDATA>

これにより、CDATAセクションが事実上停止および再起動されます。

エンコードの問題

テキストデータでは、?xml ...?>ヘッダーで宣言されたエンコードで使用できないUnicode文字は、&#nnn;を使用して表すことができます。数字の参照。ただし、CDATAセクション内のテキストは、エンコードで使用可能な文字に厳密に制限されています。

このため、CDATAセクションをプログラムで使用して「&」または「」文字を含む可能性のあるデータを引用すると、データにエンコードで表現できない文字が含まれる場合に問題が発生する可能性があります。エンコーダの実装によっては、これらの文字が失われたり、&#nnn;の文字に変換されたりする可能性があります。文字参照、またはエンコードの失敗を引き起こす可能性があります。しかし、それらは維持されません。

もう1つの問題は、トランスポート中にXMLドキュメントをあるエンコードから別のエンコードにトランスコードできることです。 XMLドキュメントがASCIIなどのより制限された文字セットに変換されると、それ以上表現できない文字は&#nnn;に変換されます。ロスレス変換のための文字参照。ただし、CDATAセクション内では、これらの文字はまったく表現できず、削除するか、同等の文字に変換して、CDATAセクションの内容を変更する必要があります。

そのため、CDATAセクションは、コードまたはXMLをデータとして含む、手動でキー入力されたXMLドキュメントにのみ使用する必要があります。これらをCDATAセクションで囲むと、読みやすくなります。ただし、XMLをプログラムで生成する場合は、CDATAセクションを避ける必要があります。

プログラム出力でのCDATAの使用

HTMLパーサーはCDATAの開始マーカーと終了マーカーを認識せず、<などのHTMLエンティティ参照も認識しないため、XHTMLドキュメントのCDATAセクションは、ドキュメントをHTMLとしてレンダリングする場合、Webブラウザーによって異なる方法で解析される傾向があります。 script>タグ内。これにより、Webブラウザーでレンダリングの問題が発生する可能性があり、信頼できないソースからのデータを表示するために使用すると、2種類のパーサーがCDATAセクションの終了位置で一致しないため、クロスサイトスクリプティングの脆弱性が生じる可能性があります。

Webページスクリプトで小なり記号()とアンパサンド(&)を使用し、それらをエスケープすることを忘れずにスタイルを制限できると便利なので、CDATAマーカーを使用するのが一般的ですXHTMLドキュメントのインラインscript>およびstyle>要素のテキスト。ただし、CDATAマーカーを認識しないHTMLパーサーでもドキュメントを解析できるように、次のJavaScriptの例のように、CDATAマーカーは通常コメントアウトされています。

script type = "text / javascript"> // !CDATA document.write( ""); // CDATA * / body {background-image:url( "marble.png?width = 300&height = 300")} / *

CDATA-type属性値

SGMLおよびXMLのドキュメントタイプ定義(DTD)ファイルでは、属性値はタイプCDATA(任意の文字データ)として指定できます。 CDATAタイプの属性内では、文字およびエンティティ参照マークアップが許可されており、ドキュメントの読み取り時に処理されます。

たとえば、XML DTDに含まれている場合

!ATTLIST foo a CDATA #IMPLIED>

これは、fooという名前の要素がオプションで、CDATA型の「 a 」という名前の属性を持つことができることを意味します。このDTDに従って有効なXMLドキュメントでは、次のような要素が表示される場合があります。

foo a = "1& 2 are<3
" />

XMLパーサーは、「 a 」属性の値を文字データ「 1&2 are 3 」として解釈します。

CDATAタイプのエンティティ

SGMLまたはXML DTDには、エンティティが文字データで構成されていることを示すためにトークンCDATAが使用されるエンティティ宣言も含まれる場合があります。文字データは、宣言自体の中に表示される場合と、URIによって参照される外部から利用可能になる場合があります。どちらの場合でも、文字参照およびパラメーターエンティティ参照マークアップはエンティティで許可され、読み取られたときにそのように処理されます。

DISPLAY_NAME Attribute = "Y"> !CDATAPFTEST0__COUNTER_6 __:4:199:、PFTEST0__COUNTER_7 __:4:199: