web-dev-qa-db-ja.com

PCDATAとCDATAは実際には何ですか?

pCDATAとCDATAの大まかな定義は次のようです

  1. PCDATAは文字データですが、解析されます。
  2. CDATAは文字データであり、は解析されません

しかし、誰かがCDATAが実際に解析されているか、PCDATAが実際に解析されていないことを教えてくれました...それで少し混乱します。誰かが本当の取引が何であるか知っていますか?

更新:私は実際にウィキペディアにPCDATA定義を追加しました...それは私の大まかな理解に過ぎないので、その答えをあまり真剣に受け止めないでください。

28

WIKIから:

[〜#〜] pcdata [〜#〜]

簡単に言えば、PCDATAはParsed CharacterDataの略です。つまり、文字はXML、XHTML、またはHTMLパーサーによって解析されます。 (&lt;は<に変更され、<p>は段落タグなどを意味すると解釈されます)。これを、XML、XHTML、またはHTMLパーサーによって文字が解析されないCDATAと比較してください。

[〜#〜] cdata [〜#〜]

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

23
Ólafur Waage

PCDATAとCDATAの両方が解析されます。どちらも文字データです。

どちらも有効な文字のみを含める必要があります。たとえば、ドキュメントのエンコーディングがUTF-8の場合、CDATAセクションのコンテンツは引き続き有効なUTF-8文字である必要があります。したがって、ランダムなバイナリデータは、ドキュメントの整形を妨げる可能性があります。また、CDATAセクションは、終了セクションタグを見つけるためだけに、引き続き解析されます。ただし、<、>、&などの他のマークアップのような文字は無視され、パーサーによってそのまま渡されます。

PCDATAの文字通りの<および&(および属性値の 'または ")のOTOHはエスケープする必要があります。エスケープしないと、マークアップとして解釈されます。エンティティも展開されます。

そうです、CDATAセクションは実際に解析されます。 PCDATAが解析されないと言われた理由はわかりません。

9
mirod
6
AndrewS
  • PCDATAは、パーサーによって解析されるテキストです。テキスト内のタグはマークアップとして扱われ、エンティティが展開されます。
  • CDATAは、パーサーによって解析されるnotテキストです。テキスト内のタグはnotマークアップとして扱われ、エンティティは展開されません。

デフォルトでは、すべてがPCDATAです。次の例では、ルートを無視して解析され、コンテンツはなく、子が1つあります。

<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>

要素にテキストのみが含まれ、子要素が含まれないように指定する場合は、キーワードPCDATAを使用します。このキーワードは、要素に解析可能な文字データ、つまり、文字よりも小さい(< )、大なり記号(>)、アンパサンド(&)、引用符( ')、二重引用符( ")。

次の例では、barはCDATAであり、解析されず、コンテンツ「content!」が含まれています。

<?xml version="1.0"?>
<foo>
<bar><![CDATA[<test>content!</test>]]></bar>
</foo>

SGMLにはいくつかのコンテンツモデルがあります。 #PCDATAコンテンツモデルは、要素にプレーンテキストが含まれている可能性があることを示しています。その「解析済み」部分は、その中のマークアップ(PI、コメント、およびSGMLディレクティブを含む)が生のテキストとして表示されるのではなく、解析されることを意味します。また、エンティティ参照が置き換えられることも意味します。

プレーンテキストコンテンツを許可する別のタイプのコンテンツモデルはCDATAです。 XMLでは、要素コンテンツモデルは暗黙的にCDATAに設定されない場合がありますが、SGMLでは、要素のコンテンツでマークアップとエンティティ参照が無視されることを意味します。ただし、CDATAタイプの属性では、エンティティ参照が置き換えられます。

XMLでは、#PCDATAが唯一のプレーンテキストコンテンツモデルです。要素内のテキストコンテンツを許可したい場合に使用します。 CDATAコンテンツモデルは、#PCDATAのCDATAブロックマークアップを介して明示的に使用できますが、要素のコンテンツはデフォルトでCDATAとして定義されていない場合があります。

DTDでは、テキストを含む属性のタイプはCDATAである必要があります。属性宣言のCDATAキーワードは、XMLドキュメントのCDATAセクションとは異なる意味を持っています。 CDATAセクションでは、「]]>」終了タグを除くすべての文字(<、>、&、および「文字を含む)」が有効です。

#PCDATAは、属性のタイプには適していません。 「リーフ」テキストのタイプに使用されます。

#PCDATAには、単に歴史的な理由から、ハッシュ(「ハッシュタグ」またはオクトソープとも呼ばれます)が付加されます。

3
Rose Perrone

XHTML DTDでデフォルトで要素のみがCDATAに設定されている場合、多くの醜い手動オーバーライドを節約できます...スクリプトブロックに他の要素が含まれるのはなぜですか?そのような要素がある場合、それらはDOM操作アクションでJSインタープリターによって処理されます。その場合でも、ドキュメントの挿入とレンダリングの前に、XMLパーサーによって完全に無視される必要があります。外部スクリプトリソースファイルの使用を強制するように設計されている可能性がありますが、これは最終的には良いことです。

0
trojjer

あなたの最初の定義は正しいです。

PCDATAが解析されます。これは、エンティティが展開され、テキストがマークアップとして扱われることを意味します。 CDATAはXMLパーサーによって解析されません。

0