XML'deki <! [CDATA []]> ne anlama geliyor?


1014

Sık sık bu garip CDATAetiketi XMLdosyalarda bulurum :

<![CDATA[some stuff]]>

Bu CDATAetiketin her zaman başında geldiğini ve ardından bazı şeyler izlediğini gözlemledim .

Ama bazen kullanılır, bazen kullanılmaz. some stuffBundan sonra eklenecek "veri" olduğunu işaretlemek olduğunu varsayalım . Fakat ne tür veriler var some stuff? XML etiketlerine yazdığım hiçbir şey bir tür veri değil mi?

Yanıtlar:


951

CDATA açılımı karakter veri ve bu dizeleri arasında veri verileri içermektedir demektir olabilir XML biçimlendirmesi olarak yorumlanabilir, ancak olmamalıdır.

CDATA ve yorumlar arasındaki temel farklar şunlardır:

Bu, iyi biçimlendirilmiş bir belgeden bu dört XML snippet'inin verildiği anlamına gelir:

<!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 dizisinin bir karakteri nasıl kaçabilir?
Thomas Weller

23
Sen olmak zorunda iki bitiştirmek için CDATA bölümleri ]]ve >- bakınız bu cevabı hows ve whys için.
Sean Vieira

2
CDATA başlangıcı ile ham veri arasında yeni bir satır karakteri olmalı mı?
16:48

2
HayırBenSewards yok
Sean Vieira

5
Bu parça Yani C-benzeri koduna kolayca bir CDATA bölümü koymak olamazdı: if (a[b[c]]>10) { }.
Anders Tornblad

341

CDATA bölümü, " ayrıştırıcının biçimlendirme değil, yalnızca karakter verileri olarak yorumlaması için işaretlenmiş öğe içeriğinin bir bölümüdür. "

Sözdizimsel olarak, bir yoruma benzer şekilde davranır:

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

... ama yine de belgenin bir parçası:

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

Aşağıdakileri bir .xhtmldosya ( değil .html ) olarak kaydetmeyi deneyin ve yorum ile CDATA bölümü arasındaki farkı görmek için FireFox'u ( Internet Explorer değil ) kullanarak açın ; CDATA bölümü belgeye bir tarayıcıda baktığınızda yorum görünmez:

<?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 bölümlerinde dikkat edilmesi gereken bir şey kodlamaları olmadığıdır, bu nedenle dizeyi ]]>bunlara eklemenin bir yolu yoktur . İçerdiği karakter verilerinin ]]>- bildiğim kadarıyla - bunun yerine bir metin düğümü olması gerekir. Benzer şekilde, bir DOM manipülasyon perspektifinden aşağıdakileri içeren bir CDATA bölümü oluşturamazsınız ]]>:

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

Bu DOM düzenleme kodu bir istisna atar (Firefox'ta) veya kötü yapılandırılmış bir XML belgesiyle sonuçlanır: http://jsfiddle.net/9NNHA/


3
Öyleyse neden CDATA'da "ý" ya izin verilmiyor?
bjan

10
@bjan - Bunun yasa dışı bir karakter olduğunu düşündüren nedir? Bir kodlama sorununuz olabilir.
Richard JP Le Guen

Belgeyi IE'de açtım, ayrıca geçersiz bir karakter olarak bildiren MSXML ayrıştırıcısını kullanıyorum. İçinde "type =" xs: string "" olarak bildirilen bir xsd var. Kodlama veya xml sürümü ile mi ilgili?
bjan

CDATA ayrıştırılır ve burada sadece geçerli karakter aralığına izin verilir, aksi halde işaretleme olarak tanınacak karakter içeren metin bloklarından kaçmak için kullanılır
bjan

1
Bu nedenle, HTML'yi XML belgesi yapısını karıştırmamak için bazı HTML'yi XML belgesine sokmak için CDATA'yı kullanabiliriz ve daha sonra dışarı çıkarmak ve çıktısı olan bir HTML belgesine tükürmek için XSLT'yi daha sonra kullanabiliriz.
Kaz

69

Büyük bir kullanım örneği: xml'niz veri olarak bir program içerir (örneğin, Java için bir web sayfası öğreticisi). Bu durumda verilerinizde '&' ve '<' içeren büyük bir karakter grubu bulunur, ancak bu karakterlerin xml olması gerekmez.

Karşılaştırmak:

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

ile

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

Özellikle bu kodu bir dosyadan kopyalarsanız / yapıştırırsanız (veya bir ön işlemcide), xml dosyanızda istediğiniz karakterlerin XML etiketleri / öznitelikleri ile karıştırılmaması yeterlidir. @Paary'nin belirttiği gibi, diğer yaygın kullanımlar arasında, ve işaretleri içeren URL'leri yerleştirdiğinizde bulunur. Son olarak, veriler sadece birkaç özel karakter içeriyor olsa da veriler çok çok uzun olsa bile (bir bölümün metni diyelim), xml dosyanızı düzenlerken bu birkaç varlığı kodlamak / kodunu çözmek zorunda değilsiniz. .

(Yorumların tüm karşılaştırmaları biraz yanıltıcı / yararsızdır.)


41

Bir keresinde xml öğesinin HTML kodunu saklaması gerektiğinde CDATA kullanmak zorunda kaldım. Gibi bir şey

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

Dolayısıyla CDATA, <ve> gibi XML etiketi olarak yorumlanabilecek herhangi bir karakteri yok sayacağı anlamına gelir.


2
"Tag" değil, ilk cümledeki öğe.
Ludovic Kuty

32

Burada bulunan veriler XML olarak ayrıştırılmaz ve bu nedenle geçerli XML olması gerekmez veya XML gibi görünen ancak olmayan öğeler içerebilir.


16

Wikipedia'dan:

Bir XML belgesi veya harici ayrıştırılmış varlıkta, bir CDATA bölümü, ayrıştırıcı için biçimlendirme değil, yalnızca karakter verisi olarak yorumlanması için işaretlenen öğe içeriğinin bir bölümüdür.

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

Bu nedenle: CDATA içindeki metin ayrıştırıcı tarafından ancak XML düğümleri olarak değil, karakterler olarak görülür.


13

Kullanımının başka bir örneği olarak:

Bir RSS Feed'iniz (xml belgesi) varsa ve açıklamanın gösterimine bazı temel HTML kodlamaları eklemek istiyorsanız, CData'yı kodlamak için kullanabilirsiniz:

<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 Okuyucu açıklamayı alır ve HTML'yi CDATA içinde işler.

Not - tüm HTML etiketleri çalışmaz - bence kullandığınız RSS okuyucusuna bağlıdır.


Ve bu örneğin neden CData'yı (ve uygun pubData ve dc: creator etiketlerini değil) kullandığının açıklaması olarak: bu, gerçek biçimlendirme kontrolümüzün olmadığı bir RSS widget'ı kullanan web sitesi görüntüleme içindir.

Bu, eklenen görüntünün yüksekliğini ve konumunu belirlememize, yazar adlarını ve tarihini doğru bir şekilde biçimlendirmemize ve yeni bir widget'a gerek duymadan bize izin verir. Ayrıca bunu senaryolayabileceğim ve elle eklemek zorunda kalmayacağım anlamına geliyor.


9

CDATA, Karakter Verileri anlamına gelir. Bunu, normal XML olarak kabul edilecek bazı karakterlerden kaçmak için kullanabilirsiniz. Bunun içindeki veriler ayrıştırılmaz. Örneğin, içinde &bulunan bir URL'yi iletmek istiyorsanız , bunu yapmak için CDATA'yı kullanabilirsiniz. Aksi takdirde, normal XML olarak ayrıştırılacağı için bir hata alırsınız.


6

Belirli karakterler içerdiğinden, aksi takdirde xml olarak görülebilen verileri içermek için kullanılır.

Bu şekilde içerideki veriler görüntülenir, ancak yorumlanmaz.


5

Her zamanki gibi XML'e geçirilemeyen bir dizeden kaçar:

Misal:

Dizede "&" bulunur.

Yapamazsın:

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

Bu nedenle, CDATA kullanmalısınız:

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

1

Genellikle resimler veya ses verileri gibi özel verileri bir XML belgesine gömmek için kullanılır.


3
Metin kodlu ikili verileri bir CDATA bölümüne yerleştirebilmenize rağmen, CDATA'nın ikili herhangi bir şeyle doğrudan ilgisi olmadığından buna gerek yoktur.
Joel Mueller

1

Cdata, bir xml ayrıştırıcısına iletmek isteyebileceğiniz ve yine de xml olarak yorumlanmayan bir veridir.

Örneğin deyin: - Soru / cevap nesnesini içeren bir xml'niz var. Bu tür açık alanlar, temel veri türü veya xml tanımlı özel veri türleri altında kesinlikle yer almayan herhangi bir veriye sahip olabilir. Beğen - Bu xml yorumu için doğru etiket mi? .-- xml ayrıştırıcısı tarafından başka bir alt öğe olarak yorumlanmadan olduğu gibi iletme gereksiniminiz olabilir. İşte Cdata kurtarmaya geliyor. Cdata olarak bildirerek, ayrıştırıcıya xml olarak sarılmış verileri işlemediğini söylüyorsunuz (buna benzeyebilir)


0

CDATAYapının yalnızca metni doğrudan XML metin dosyasına yerleştirirken gerekli olduğunu unutmayın .

Yani, yalnızca CDATAXML metnini doğrudan yazarken veya programlı olarak oluştururken kullanmanız gerekir .

Bir DOM işlemci API'sı veya SimpleXML kullanılarak girilen metinler, XML içerik kurallarının faul çalışmasını önlemek için otomatik olarak kaçar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.