Apa arti <! [CDATA []]> dalam XML?

1014

Saya sering menemukan CDATAtag aneh ini di XMLfile:

<![CDATA[some stuff]]>

Saya telah mengamati bahwa CDATAtag ini selalu muncul di awal, dan kemudian diikuti oleh beberapa hal.

Tetapi kadang-kadang digunakan, kadang tidak. Saya menganggap itu adalah untuk menandai bahwa some stuff"data" yang akan dimasukkan setelah itu. Tapi data apa itu some stuff? Apakah tidak ada yang saya tulis dalam tag XML semacam data?

profilProfile dontWatch
sumber

Jawaban:

951

CDATA adalah singkatan dari Character Data dan itu berarti bahwa data di antara string ini termasuk data yang dapat diartikan sebagai markup XML, tetapi seharusnya tidak.

Perbedaan utama antara CDATA dan komentar adalah:

Ini berarti diberikan empat cuplikan XML ini dari satu dokumen yang dibuat dengan baik:

<!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>
Sean Vieira
sumber
35
Bagaimana karakter urutan CEND dapat diloloskan?
Thomas Weller
23
Anda harus memiliki dua bagian CDATA untuk menggabungkan ]]dan >- lihat jawaban ini untuk bagaimana dan mengapa.
Sean Vieira
2
apakah harus ada karakter baris baru di antara awal CDATA dan data mentah?
Ben Sewards
2
Tidak ada tidak @BenSewards
Sean Vieira
5
Jadi ini bagian dari C-seperti kode tidak bisa dengan mudah dimasukkan ke dalam bagian CDATA: if (a[b[c]]>10) { }.
Anders Tornblad
341

Bagian CDATA adalah " bagian konten elemen yang ditandai untuk diurai oleh pengurai sebagai hanya data karakter, bukan markup. "

Secara sintaksis, ini berperilaku mirip dengan komentar:

<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>

... tetapi masih merupakan bagian dari dokumen:

<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>

Coba simpan yang berikut ini sebagai .xhtmlfile ( bukan .html ) dan buka menggunakan FireFox ( bukan Internet Explorer ) untuk melihat perbedaan antara komentar dan bagian CDATA; komentar tidak akan muncul ketika Anda melihat dokumen di browser, sedangkan bagian CDATA akan:

<?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>

Sesuatu yang perlu diperhatikan dengan bagian CDATA adalah bahwa mereka tidak memiliki encoding, jadi tidak ada cara untuk memasukkan string ]]>ke dalamnya. Setiap data karakter yang berisi ]]>harus - sejauh yang saya tahu - menjadi simpul teks. Demikian juga, dari perspektif manipulasi DOM Anda tidak dapat membuat bagian CDATA yang meliputi ]]>:

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

Kode manipulasi DOM ini akan memberikan pengecualian (di Firefox) atau menghasilkan dokumen XML yang tidak terstruktur: http://jsfiddle.net/9NNHA/

Richard JP Le Guen
sumber
3
Lalu mengapa "ý" tidak diizinkan dalam CDATA?
bjan
10
@ Bjan - Apa yang membuatmu berpikir itu karakter ilegal? Kedengarannya Anda mungkin memiliki masalah penyandian.
Richard JP Le Guen
Saya membuka dokumen di IE, saya juga menggunakan parser MSXML yang menyatakannya sebagai karakter yang tidak valid. Saya memiliki xsd di mana ia dinyatakan sebagai "type =" xs: string "". Apakah ini terkait dengan penyandian atau versi xml?
bjan
CDATA diurai dan hanya rentang karakter yang valid yang diperbolehkan di sini, juga digunakan untuk menghindari blok teks yang berisi karakter yang jika tidak akan dikenali sebagai markup
bjan
1
Jadi kita bisa menggunakan CDATA untuk menyelundupkan beberapa HTML ke dalam dokumen XML, sehingga HTML tidak membingungkan struktur dokumen XML, dan kemudian menggunakan XSLT nanti untuk menariknya keluar dan meludahkannya ke dalam dokumen HTML yang sedang di-output.
Kaz
69

Satu kasus penggunaan besar: xml Anda menyertakan program, sebagai data (mis. Tutorial halaman web untuk Java). Dalam situasi itu, data Anda menyertakan sejumlah besar karakter yang menyertakan '&' dan '<' tetapi karakter tersebut tidak dimaksudkan sebagai xml.

Membandingkan:

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

dengan

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

Terutama jika Anda menyalin / menempelkan kode ini dari file (atau memasukkannya, dalam pra-prosesor), senang memiliki karakter yang Anda inginkan dalam file xml Anda, tanpa membingungkan mereka dengan tag / atribut XML. Seperti @paary sebutkan, kegunaan umum lainnya termasuk ketika Anda menyematkan URL yang berisi ampersand. Akhirnya, bahkan jika data hanya berisi beberapa karakter khusus tetapi datanya sangat sangat panjang (teks dari sebuah bab, katakanlah), senang tidak harus meng-en-de-coding beberapa entitas tersebut saat Anda mengedit file xml Anda .

(Saya menduga semua perbandingan komentar agak menyesatkan / tidak membantu.)

bukan-just-yeti
sumber
41

Saya pernah harus menggunakan CDATA ketika elemen xml saya diperlukan untuk menyimpan kode HTML. Sesuatu seperti

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

Jadi CDATA berarti akan mengabaikan karakter apa pun yang dapat diartikan sebagai tag XML seperti <dan> dll.

Oktan
sumber
2
Bukan "tag" tetapi elemen dalam kalimat pertama.
Ludovic Kuty
32

Data yang terkandung di dalamnya tidak akan diuraikan sebagai XML, dan karena itu tidak perlu menjadi XML yang valid atau dapat mengandung elemen yang mungkin tampak XML tetapi tidak.

untuk melakukannya
sumber
16

Dari Wikipedia:

[Dalam] dokumen XML atau entitas parsing eksternal, bagian CDATA adalah bagian konten elemen yang ditandai untuk diurai oleh parser sebagai hanya data karakter, bukan markup.

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

Jadi: teks di dalam CDATA dilihat oleh parser tetapi hanya sebagai karakter bukan sebagai simpul XML.

Chdid
sumber
13

Sebagai contoh lain penggunaannya:

Jika Anda memiliki Umpan RSS (dokumen xml) dan ingin memasukkan beberapa penyandian HTML dasar dalam tampilan deskripsi, Anda dapat menggunakan CData untuk menyandikannya:

<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>

Pembaca RSS menarik deskripsi dan merender HTML dalam CDATA.

Catatan - tidak semua tag HTML berfungsi - Saya pikir ini tergantung pada pembaca RSS yang Anda gunakan.


Dan sebagai penjelasan mengapa contoh ini menggunakan CData (dan bukan pubData dan dc: tag pembuat yang sesuai): ini untuk tampilan situs web menggunakan widget RSS yang kami tidak memiliki kontrol pemformatan nyata.

Ini memungkinkan kami untuk menentukan ketinggian dan posisi gambar yang disertakan, memformat nama dan tanggal penulis dengan benar, dan sebagainya, tanpa perlu widget baru. Ini juga berarti saya dapat membuat skrip ini dan tidak perlu menambahkannya dengan tangan.

LadyCygnus
sumber
9

CDATA adalah singkatan dari Character Data. Anda dapat menggunakan ini untuk menghindari beberapa karakter yang jika tidak akan diperlakukan sebagai XML biasa. Data di dalam ini tidak akan diuraikan. Misalnya, jika Anda ingin meneruskan URL yang berisi &di dalamnya, Anda dapat menggunakan CDATA untuk melakukannya. Jika tidak, Anda akan mendapatkan kesalahan karena akan diuraikan sebagai XML biasa.

paary
sumber
6

Ini digunakan untuk berisi data yang dapat dilihat sebagai xml karena mengandung karakter tertentu.

Dengan cara ini data di dalam akan ditampilkan, tetapi tidak diartikan.

Ikke
sumber
5

Itu lolos dari string yang tidak dapat diteruskan ke XML seperti biasa:

Contoh:

String berisi "&" di dalamnya.

Kamu tidak bisa:

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

Karena itu, Anda harus menggunakan CDATA:

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

Biasanya digunakan untuk menyematkan data khusus, seperti gambar atau data suara dalam dokumen XML.

Johan
sumber
3
Meskipun Anda bisa memasukkan data biner yang disandikan teks pada bagian CDATA, Anda tidak harus melakukannya, karena CDATA tidak ada hubungannya langsung dengan biner apa pun.
Joel Mueller
1

Cdata adalah data yang Anda mungkin ingin sampaikan ke parser xml dan masih tidak ditafsirkan sebagai xml.

Katakan misalnya: - Anda memiliki xml yang telah merangkum objek pertanyaan / jawaban. Bidang terbuka tersebut dapat memiliki data apa pun yang tidak secara ketat termasuk dalam tipe data dasar atau xml tipe data khusus yang ditentukan. Suka - Apakah ini tag yang benar untuk komentar xml? .-- Anda mungkin memiliki persyaratan untuk meneruskannya tanpa ditafsirkan oleh parser xml sebagai elemen anak lainnya. Di sini Cdata datang untuk menyelamatkan Anda. Dengan mendeklarasikan sebagai Cdata, Anda memberi tahu parser jangan memperlakukan data yang dibungkus sebagai xml (meskipun mungkin terlihat seperti salah satu)

keserampangan
sumber
0

Perhatikan bahwa CDATAkonstruk hanya diperlukan jika menempatkan teks secara langsung dalam file teks XML.

Artinya, Anda hanya perlu menggunakan CDATAjika pengetikan tangan atau secara langsung membuat teks XML.

Teks apa pun yang dimasukkan menggunakan DOM prosesor API atau SimpleXML akan secara otomatis lolos untuk mencegah menjalankan pelanggaran aturan konten XML.

Patanjali
sumber