web-dev-qa-db-ja.com

XMLの<![CDATA []]>はどういう意味ですか?

私はよくCDATAファイルにこの奇妙なXMLタグを見つけます。

<![CDATA[some stuff]]>

私はこのCDATAタグは常に最初に来て、その後にいくつかのものが続くことを観察しました。

しかし時々それは使われ、時々それは使われません。 some stuffがその後に挿入される「データ」であることをマークすることだと思います。しかし、some stuffとはどんな種類のデータですか? XMLタグで書いたものがなんらかのデータではないでしょうか。

918

CDATACharacter Data を表し、これはこれらの文字列の間にあるデータにができるデータを含むことを意味しますXMLマークアップとして解釈されますが、そうではありません。

CDATAとコメントの主な違いは次のとおりです。

これは、1つの整形式の文書から、次の3つのXMLの断片が与えられたことを意味します。

<!ENTITY MyParamEntity "Has been expanded">

<!--
Within this comment I can use ]]>
and other reserved characters like <
&, ', and ", but %MyParamEntity; will not be expanded
(if I retrieve the text of this node it will contain
%MyParamEntity; and not "Has been expanded")
and I can't place two dashes next to each other.
-->

<![CDATA[
Within this Character Data block I can
use double dashes as much as I want (along with <, &, ', and ")
*and* %MyParamEntity; will be expanded to the text
"Has been expanded" ... however, I can't use
the CEND sequence. If I need to use CEND I must escape one of the
brackets or the greater-than sign using concatenated CDATA sections.
]]>

<description>An example of escaped CENDs</description>
<!-- This text contains a CEND ]]> -->
<!-- In this first case we put the ]] at the end of the first CDATA block
     and the > in the second CDATA block -->
<data><![CDATA[This text contains a CEND ]]]]><![CDATA[>]]></data>
<!-- In this second case we put a ] at the end of the first CDATA block
     and the ]> in the second CDATA block -->
<alternative><![CDATA[This text contains a CEND ]]]><![CDATA[]>]]></alternative>
873
Sean Vieira

CDATAセクションは、「 パーサーがマークアップではなく文字データとして解釈するようにマークされている要素コンテンツのセクションです。

構文的には、コメントと同じように動作します。

<exampleOfAComment>
<!--
    Since this is a comment
    I can use all sorts of reserved characters
    like > < " and &
    or write things like
    <foo></bar>
    but my document is still well-formed!
-->
</exampleOfAComment>

...しかし、それはまだドキュメントの一部です:

<exampleOfACDATA>
<![CDATA[
    Since this is a CDATA section
    I can use all sorts of reserved characters
    like > < " and &
    or write things like
    <foo></bar>
    but my document is still well formed!
]]>
</exampleOfACDATA>

以下を.xhtmlファイル(not.html)として保存し、FireFox(Internet Explorerではない)を使用して開いて、コメントとCDATAセクションブラウザでドキュメントを見てもコメントは表示されませんが、CDATAセクションには次のように表示されます。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" >
<head>
<title>CDATA Example</title>
</head>
<body>

<h2>Using a Comment</h2>
<div id="commentExample">
<!--
You won't see this in the document
and can use reserved characters like
< > & "
-->
</div>

<h2>Using a CDATA Section</h2>
<div id="cdataExample">
<![CDATA[
You will see this in the document
and can use reserved characters like
< > & "
]]>
</div>

</body>
</html>

CDATAセクションに関して注意すべきことは、それらがエンコーディングを持っていないということです。したがって、それらの中に文字列]]>を含める方法はありません。 ]]>を含む文字データは、私の知る限りではなく、代わりにテキストノードにする必要があります。同様に、DOM操作の観点からは、]]>を含むCDATAセクションを作成することはできません。

var myEl = xmlDoc.getElementById("cdata-wrapper");
myEl.appendChild(xmlDoc.createCDATASection("This section cannot contain ]]>"));

このDOM操作コードは、(Firefoxでは)例外をスローするか、または構造化されていないXML文書になります。 http://jsfiddle.net/9NNHA/

323

1つの大きなユースケース:あなたのxmlはデータとしてプログラムを含みます(例えば、Javaのためのウェブページチュートリアル)。そのような状況では、あなたのデータは '&'と '<'を含むたくさんの文字を含んでいますが、それらの文字はxmlであることを意味していません。

比較しなさい:

<example-code>
while (x &lt; len &amp;&amp; !done) {
    print( &quot;Still working, &apos;zzz&apos;.&quot; );
    ++x;
    }
</example-code>

<example-code><![CDATA[
while (x < len && !done) {
    print( "Still working, 'zzzz'." );
    ++x;
    }
]]></example-code>

特に、ファイルからこのコードをコピー/貼り付けする場合(またはプリプロセッサに含める場合)、XMLファイルに必要な文字だけを入れてXMLタグ/属性と混同しないでください。 @paaryが述べたように、他の一般的な用途はアンパサンドを含むURLを埋め込むときです。最後に、たとえデータにいくつかの特殊文字しか含まれていなくても、データが非常に長い場合(チャプターのテキストなど)、xmlファイルを編集するときにこれらの少数のエンティティをen/decodeする必要がないのはいいことです。 。

(コメントとの比較はすべて、誤解を招くようなもので、役に立たないものと思われます。)

63
not-just-yeti

私のxml要素がHTMLコードを格納する必要があるとき、私はかつてCDATAを使わなければなりませんでした。何かのようなもの

<codearea>
  <![CDATA[ 
  <div> <p> my para </p> </div> 
  ]]>
</codearea>

そのためCDATAとは、<や>などのXMLタグとして解釈される可能性のあるすべての文字を無視するという意味です。

37
Octane

そこに含まれるデータはXMLとして構文解析されないので、それ自体が有効なXMLである必要はないか、またはXMLであるように見えるかもしれないがそうでない要素を含むことができます。

28
fbrereto

ウィキペディアより

[in] XML文書または外部で解析された実体では、CDATAセクションは、マークアップではなく文字データとしてのみ解釈するようにパーサーにマークされている要素コンテンツのセクションです。

http://en.wikipedia.org/wiki/CDATA

CDATA内のテキストはパーサーからは見えますが、XMLノードとしてではなく文字としてのみ見えます。

12
Chdid

その使用の他の例として:

RSSフィード(xml文書)があり、説明の表示に基本的なHTMLエンコードを含めたい場合は、CDataを使用してそれをエンコードすることができます。

<item>
  <title>Title of Feed Item</title>
  <link>/mylink/article1</link>
  <description>
    <![CDATA[
      <p>
      <a href="/mylink/article1"><img style="float: left; margin-right: 5px;" height="80" src="/mylink/image" alt=""/></a>
      Author Names
      <br/><em>Date</em>
      <br/>Paragraph of text describing the article to be displayed</p>
    ]]>
  </description>
</item>

RSSリーダーは説明を取り込み、HTMLをCDATA内にレンダリングします。

注 - すべてのHTMLタグが機能するわけではありません - 使用しているRSSリーダーに依存していると思います。


そして、なぜこの例がCData(そして適切なpubDataとdc:creatorタグではない)を使うのかについての説明として:これは私達が本当のフォーマット制御を持っていないRSSウィジェットを使ったウェブサイト表示のためです。

これにより、新しいウィジェットを必要とせずに、含まれる画像の高さと位置を指定したり、作成者の名前と日付を正しくフォーマットしたりすることができます。それは私がこれをスクリプト化することができ、それらを手作業で追加する必要がないことも意味します。

11
LadyCygnus

CDATAはCharacter Dataの略です。これを使えば、通常のXMLとして扱われることになるいくつかの文字をエスケープすることができます。この中のデータは解析されません。たとえば、&を含むURLを渡したい場合は、CDATAを使用してそれを実行できます。それ以外の場合は、通常のXMLとして解析されるため、エラーが発生します。

8
paary

それは特定の文字を含んでいるのでxmlとして見られることができるデータを含むために使用されていました。

このようにして内部のデータは表示されますが、解釈はされません。

5
Ikke

通常通りXMLに渡すことができない文字列をエスケープします。

例:

文字列の中に "&"が含まれています。

それはいけません:

<FL val="Company Name">Dolce & Gabbana</FL>

したがって、CDATAを使用する必要があります。

<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>
1
HoangYell

Cdataは、あなたがxmlパーサーに渡したいかもしれないが、それでもxmlとして解釈されないかもしれないデータです。

例を挙げましょう。 - 質問/回答オブジェクトをカプセル化したxmlがあります。このようなオープンフィールドは、基本データ型またはxml定義のカスタムデータ型に厳密には該当しない任意のデータを持つことができます。 Like - これはxmlコメントの正しいタグですか?.-- xmlに解釈されずにそのまま渡す必要があるかもしれません。別の子要素としてのパーサーここでCdataはあなたの助けになります。 Cdataとして宣言することによって、あなたはパーサがxmlとしてラップされたデータを扱わないことを伝えています(それは1つのように見えるかもしれませんが)

1
randomness

通常、写真や音声データなどのカスタムデータをXMLドキュメントに埋め込むために使用されます。

1
Johan