DTD#PCDATA
のと#CDATA
の違いは何ですか?
7 に答える
PCDATA
パーサーによって解析されるテキストです。テキスト内のタグはマークアップとして扱われ、エンティティは展開されます。CDATA
パーサーによって解析されないテキストです。テキスト内のタグは マークアップとして扱われず、エンティティは展開されません。
デフォルトでは、すべてがPCDATA
. 次の例では、ルートを無視<bar>
すると解析され、コンテンツはなく、1 つの子が含まれます。
<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>
要素にテキストのみが含まれ、子要素が含まれないように指定する場合は、キーワード を使用します。これは、このキーワードが、要素に解析可能な文字データ (つまり、( )PCDATA
未満の文字を除くすべてのテキスト) を含める必要があることを指定するためです。<
大なり ( >
) 、アンパサンド ( &
)、引用 ( '
)、および二重引用符 ( "
)。
次の例では、<bar>
contains CDATA
. その内容は解析されないため、<test>content!</test>
.
<?xml version="1.0"?>
<foo>
<bar><![CDATA[<test>content!</test>]]></bar>
</foo>
SGML にはいくつかのコンテンツ モデルがあります。コンテンツ モデルは、#PCDATA
要素にプレーン テキストを含めることができると述べています。その「解析された」部分は、その中のマークアップ (PI、コメント、および SGML ディレクティブを含む) が生のテキストとして表示される代わりに解析されることを意味します。また、エンティティ参照が置き換えられることも意味します。
プレーン テキスト コンテンツを許可する別のタイプのコンテンツ モデルはCDATA
です。XML では、要素コンテンツ モデルが暗黙的に に設定されない場合がありますCDATA
が、SGML では、要素のコンテンツでマークアップとエンティティ参照が無視されることを意味します。ただし、タイプの属性でCDATA
は、エンティティ参照が置き換えられます。
XML では#PCDATA
、唯一のプレーン テキスト コンテンツ モデルです。要素にテキスト コンテンツを許可したい場合に使用します。CDATA
コンテンツ モデルは、 のブロック マークアップを通じて明示的に使用できますがCDATA
、#PCDATA
要素のコンテンツはデフォルトで定義されていない場合がありCDATA
ます。
DTD では、テキストを含む属性の型は でなければなりませんCDATA
。属性宣言のキーワードは、XML ドキュメントCDATA
のセクションとは異なる意味を持ちます。セクションでは、終了タグを除くすべての文字 ( CDATA
、、、および文字を含む)が有効です。CDATA
<
>
&
'
"
]]>
#PCDATA
属性のタイプに適していません。「リーフ」テキストのタイプに使用されます。
#PCDATA
このキーワードを指定された要素と区別するために、コンテンツ モデルの先頭にハッシュが追加されますPCDATA
(これは完全に合法です)。
PCDATA - 解析済み文字データ
XML パーサーは通常、XML ドキュメント内のすべてのテキストを解析します。
CDATA - (解析されていない) 文字データ
CDATA という用語は、XML パーサーによって解析されるべきではないテキスト データについて使用されます。
「<」や「&」などの文字は、XML 要素では使用できません。
DTD では、PCDATA と CDATA を使用して、要素と属性の許容可能な内容について何かをアサートします。要素のコンテンツ モデルでは、#PCDATA は要素が「古いテキスト」を含む (含む可能性がある) ことを示します。(以下に示す例外を除きます。) 属性の宣言では、CDATA は、属性の許容値に適用できる一種の制約です (その他の種類はすべて相互に排他的で、ID、IDREF、および NMTOKEN が含まれます)。許容値が CDATA である属性には、(要素内の PCDATA のように) 「任意の古いテキスト」を含めることができます。
非常に紛らわしい可能性がある問題は、マークされたセクションとも呼ばれる別の「CDATA」があることです。マークされたセクションは、特殊な文字列で区切られた要素 (#PCDATA) コンテンツの一部です: それを閉じます。PCDATA が「解析された文字データ」であることを覚えていれば、CDATA セクションは「解析された」部分がなくても文字通り同じものです。パーサーは、< や & などの特殊文字に遭遇するたびに問題なく、マークされたセクションのコンテンツをダウンストリーム アプリケーションに送信します。これは、これらの特殊文字 (スクリプトやコード フラグメントなど) を多数含むドキュメントをコーディングする場合に便利です。対応するエンティティ参照よりも、データの入力と読み取りが簡単です。
したがって、「すべての古いテキスト」規則の例外は、PCDATA がこれらのエスケープされていない特殊文字を含めることはできないということであると推測できます。