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


1014

私はしばしばこの奇妙なCDATAタグをXMLファイルで見つけます:

<![CDATA[some stuff]]>

このCDATAタグが常に最初に来て、その後にいくつかのものが続くことに気づきました。

ただし、使用される場合と使用されない場合があります。それがsome stuffその後に挿入される「データ」であることをマークすることだと思います。しかし、どのようなデータsome stuffですか?XMLタグで何かを書いても何かのデータはありませんか?

回答:


951

CDATACharacter Dataの略で、これらの文字列の間にあるデータには、XMLマークアップとして解釈される可能性があるが、そうでないデータが含まれていることを意味します。

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

これは、1つの整形式ドキュメントからの次の4つの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>

35
CENDシーケンスの文字をどのようにエスケープできますか?
トーマスウェラー2015

23
とを連結するには、2つの CDATAセクションが必要です-方法]]と理由については、この回答>参照してください。
Sean Vieira 2015

2
CDATAの開始と生データの間に改行文字が必要ですか?
Ben Sewards、2016年

2
いいえ、@ BenSewardsはありません
Sean Vieira、

5
したがって、このCライクなコードは、CDATAセクションに簡単に配置できませんでしたif (a[b[c]]>10) { }
Anders Tornblad 2017年

341

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ファイルを(ではなく .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/


3
では、なぜ「ý」がCDATAで許可されていないのですか?
bjan 2013

10
@bjan-それを違法なキャラクターだと思う理由は何ですか?エンコードに問題があるようです。
Richard JP Le Guen 2013

IEでドキュメントを開きました。無効な文字として宣言したMSXMLパーサーも使用しています。「type = "xs:string"」と宣言されているxsdがあります。エンコーディングまたはxmlバージョンに関連していますか?
2013

CDATAは解析され、ここでも有効な文字の範囲のみが許可されます。これは、マークアップとして認識される文字を含むテキストのブロックをエスケープするために使用されます
bjan

1
したがって、CDATAを使用して一部のHTMLをXMLドキュメントに密輸し、HTMLがXMLドキュメントの構造を混乱させないようにし、後でXSLTを使用してそれを引き出し、出力されるHTMLドキュメントに吐き出すことができます。
Kaz

69

1つの大きなユースケース:xmlにはデータとしてプログラムが含まれています(JavaのWebページチュートリアルなど)。そのような状況では、データに「&」と「<」を含む大きな文字の塊が含まれていますが、これらの文字は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ファイルを編集するときにこれらの少数のエンティティをエンコードまたはデコードする必要がないのは素晴らしいことです。 。

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


41

HTMLコードを格納するためにxml要素が必要な場合、CDATAを使用する必要がありました。何かのようなもの

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

したがって、CDATAは、<や>などのXMLタグとして解釈される可能性がある文字を無視することを意味します。


2
「タグ」ではなく、最初の文の要素。
Ludovic Kuty 2016年

32

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


16

ウィキペディアから:

[In] XMLドキュメントまたは外部解析エンティティでは、CDATAセクションは要素コンテンツのセクションであり、パーサーがマークアップではなく文字データとして解釈するためにマークされます。

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

したがって、CDATA内のテキストはパーサーに表示されますが、XMLノードではなく文字としてのみ表示されます。


13

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

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リーダーは説明を取り込み、CDATA内でHTMLをレンダリングします。

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


そして、この例がCData(および適切なpubDataおよびdc:creatorタグではない)を使用する理由の説明として:これは、実際のフォーマットコントロールのないRSSウィジェットを使用したWebサイト表示用です。

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


9

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


6

特定の文字が含まれているためにxmlとして表示される可能性があるデータを含むために使用されます。

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


5

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

例:

文字列に「&」が含まれています。

それはいけません:

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

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

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

1

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


3
テキストエンコードされたバイナリデータをCDATAセクションに配置することもできますが、CDATAはバイナリとは直接関係がないため、配置する必要はありません。
Joel Mueller、

1

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

たとえば、次のように言います:-質問/回答オブジェクトをカプセル化したxmlがあります。そのようなオープンフィールドには、基本的なデータタイプまたはxmlで定義されたカスタムデータタイプに厳密に該当しない任意のデータを含めることができます。以下のような- これはXMLコメントのための正しいタグですか? .-- xmlパーサーによって別の子要素として解釈されずに、そのまま渡す必要がある場合があります。ここでCdataが役に立ちます。Cdataとして宣言することで、パーサーはラップされたデータをxmlとして扱わないように指示します(1つのように見える場合もあります)


0

このCDATA構造は、テキストをXMLテキストファイルに直接配置する場合にのみ必要です。

つまり、CDATA手動で入力するか、XMLテキストをプログラムで直接作成する場合にのみ使用する必要があります。

DOMプロセッサAPIまたはSimpleXMLを使用して入力されたテキストは、XMLコンテンツルールの違反を防ぐために自動的にエスケープされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.