違いは何である#PCDATA
と#CDATA
におけるDTDは?
#PCDATA
およびCDATA
です。何もありませんPCDATA
キーワードと何が #CDATA
。
違いは何である#PCDATA
と#CDATA
におけるDTDは?
#PCDATA
およびCDATA
です。何もありませんPCDATA
キーワードと何が #CDATA
。
回答:
PCDATA
パーサーによって解析されるテキストです。テキスト内のタグはマークアップとして扱われ、エンティティが展開されます。CDATA
パーサーによって解析されないテキストです。テキスト内のタグはなり
ませんマークアップとして扱われることとエンティティが展開されません。デフォルトでは、すべてがPCDATA
です。次の例では、ルートを無視して<bar>
解析され、コンテンツはなく、子が1つあります。
<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>
要素にテキストのみが含まれ、子要素が含まれないように指定する場合は、キーワードを使用しPCDATA
ます。このキーワードは、要素に解析可能な文字データ、つまり、(<
)未満の文字を除くすべてのテキストを含める必要があることを指定しているためです。大なり>
記号()、アンパサンド(&
)、引用符('
)、二重引用符("
)。
次の例で<bar>
は、が含まれています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
。CDATA
属性宣言のキーワードはCDATA
、XMLドキュメントのセクションとは異なる意味を持っています。でCDATA
セクション全ての文字が(含む合法である<
、>
、&
、'
および"
を除いて、文字)]]>
終了タグ。
#PCDATA
属性のタイプには適していません。「リーフ」テキストのタイプに使用されます。
#PCDATA
このキーワードを名前の付いた要素PCDATA
(完全に合法)と区別するために、コンテンツモデルの先頭にハッシュが追加されます。
#
ハッシュタグではありません。この記号が前に付いているタグのみがハッシュタグです。シンボル自体が持っている多くの名前「番号記号」、「シャープ記号」(主にカナダ&アメリカ)、または単に「ハッシュ」(したがって、その名前「ハッシュタグ」)を含むが、。
#PCDATA
歴史的な理由から、前の#がそこにあることに同意しません。これは、DTDでは、要素に、という名前の要素が含まれてPCDATA
いる可能性があるためです<!ELEMENT foo (PCDATA)>
。これは可能である必要があり、のようになります。
PCDATA –解析された文字データ。XMLドキュメント内のすべてのデータを解析します。
例:
<family>
<mother>mom</mother>
<father>dad</father>
</family>
ここで、<family>
要素にはさらに2つの要素が含まれています:<mother>
と<father>
。したがって、さらに解析して、母と父のテキストを取得し、家族のテキスト値を「お母さんお父さん」として与えます。
CDATA –未解析の文字データ。これは、xmlドキュメントでこれ以上解析してはならないデータです。
<family>
<![CDATA[
<mother>mom</mother>
<father>dad</father>
]]>
</family>
ここで、familyのテキスト値はになります<mother>mom</mother><father>dad</father>
。
DTDでは、PCDATAとCDATAを使用して、それぞれ要素と属性の許容可能なコンテンツについて何かを表明します。要素のコンテンツモデルでは、#PCDATAは、要素に「古いテキスト」が含まれている(含まれている可能性がある)ことを示しています。(下記の例外を除きます。)属性の宣言では、CDATAは、属性の許容値に課すことができる一種の制約です(他の種類は、すべて相互に排他的で、ID、IDREF、およびNMTOKENを含みます)。許容値がCDATAである属性(要素内のPCDATAなど)には、「古いテキスト」を含めることができます。
潜在的に本当に紛らわしい問題は、マークされたセクションとも呼ばれる別の「CDATA」があることです。マークされたセクションは、特別な文字列で区切られた要素(#PCDATA)コンテンツの一部です:それを閉じます。PCDATAが「解析された文字データ」であることを覚えている場合、CDATAセクションは、「解析された」ことを除いて、文字通り同じものです。パーサーは、マークされたセクションのコンテンツを、<や&などの特殊文字に遭遇するたびに問題なくダウンストリームアプリケーションに送信します。これは、これらの特殊文字(スクリプトやコードフラグメントなど)を多く含むドキュメントをコーディングする場合に役立ちます。対応するエンティティ参照よりも、データ入力が簡単で、読み取りも簡単です。
したがって、「古いテキスト」ルールの例外は、CDATAでマークされたセクションの範囲内にない限り、PCDATAにこれらのエスケープされていない特殊文字を含めることはできないということです。