XML में <? [CDATA []]> का क्या अर्थ है?


1014

मुझे अक्सर फाइलों CDATAमें यह अजीब टैग मिलता है XML:

<![CDATA[some stuff]]>

मैंने देखा है कि यह CDATAटैग हमेशा शुरुआत में आता है, और फिर कुछ सामान के बाद।

लेकिन कभी-कभी इसका उपयोग किया जाता है, कभी-कभी यह नहीं होता है। मुझे लगता है कि some stuffयह उस "डेटा" को चिह्नित करना है जो उसके बाद डाला जाएगा। लेकिन डेटा किस तरह का है some stuff? कुछ भी नहीं है जो मैं XML टैग में लिखता हूं कुछ प्रकार के डेटा?

जवाबों:


951

सीडीएटीए कैरेक्टर डेटा के लिए खड़ा है और इसका मतलब है कि इन स्ट्रिंग्स के बीच के डेटा में एक्सएमएल मार्कअप के रूप में व्याख्या किए जा सकने वाले डेटा शामिल हैं , लेकिन ऐसा नहीं होना चाहिए।

CDATA और टिप्पणियों के बीच मुख्य अंतर हैं:

  • जैसा कि रिचर्ड बताते हैं , सीडीएटीए अभी भी दस्तावेज़ का हिस्सा है, जबकि एक टिप्पणी नहीं है।
  • CDATA में आप स्ट्रिंग को शामिल नहीं कर सकते ]]>( CDEnd), जबकि एक टिप्पणी --अमान्य है
  • पैरामीटर एंटिटी संदर्भ टिप्पणियों के अंदर मान्यता प्राप्त नहीं हैं।

इसका मतलब है कि 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 अनुक्रम का एक चरित्र कैसे बच सकता है?
थॉमस वेलर

23
और सम्‍मिलित करने के लिए आपके पास दो सीडीएटीए अनुभाग हैं - और यह उत्तर हॉव्स और व्हिस के लिए देखें। ]]>
सीन विएरा

2
क्या CDATA प्रारंभ और कच्चे डेटा के बीच एक नई पंक्ति वर्ण होना चाहिए?
बेन सीवार्ड्स

2
नहीं @BenSewards नहीं है
सीन विएरा

5
तो सी-लाइक कोड का यह टुकड़ा आसानी से सीडीएटीए सेक्शन में नहीं डाला जा सकता है if (a[b[c]]>10) { }:।
एंडर्स तोर्ब्लाड

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 ) के रूप में सहेजने का प्रयास करें और टिप्पणी और सीडीएटीए अनुभाग के बीच अंतर देखने के लिए इसे फायरफॉक्स ( इंटरनेट एक्सप्लोरर नहीं ) का उपयोग करके खोलें ; जब आप किसी ब्राउज़र में दस्तावेज़ को देखते हैं तो यह टिप्पणी नहीं दिखाई देगी, जबकि 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 वर्गों के साथ कुछ ध्यान रखना है कि उनके पास कोई एन्कोडिंग नहीं है, इसलिए ]]>उनमें स्ट्रिंग को शामिल करने का कोई तरीका नहीं है। किसी भी वर्ण डेटा जिसमें सम्‍मिलित ]]>है - जहां तक ​​मुझे पता है - इसके बजाय एक पाठ नोड हो। इसी तरह, एक डोम हेरफेर के नजरिए से आप एक CDATA अनुभाग नहीं बना सकते हैं जिसमें शामिल हैं ]]>:

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

यह डोम हेरफेर कोड या तो एक अपवाद (फ़ायरफ़ॉक्स में) फेंक देगा या खराब संरचित एक्सएमएल दस्तावेज़ में परिणाम देगा: http://jsfiddle.net/9NNHA/


3
फिर सीडीएटी में "ý" की अनुमति क्यों नहीं है?
भजन

10
@ भजन - आपको क्या लगता है कि यह एक अवैध चरित्र है? लगता है कि आप एक एन्कोडिंग समस्या हो सकती है।
रिचर्ड जेपी ले गुएन

मैंने IE में डॉक खोला, मैं MSXML पार्सर का भी उपयोग कर रहा हूं जिसने इसे एक अमान्य चरित्र घोषित किया। मेरे पास एक xsd है जिसमें इसे "प्रकार =" xs: string "" के रूप में घोषित किया गया है। क्या यह एन्कोडिंग या xml संस्करण से संबंधित है?
भजन

CDATA को पार्स किया गया है और केवल मान्य वर्णों की ही यहाँ अनुमति दी गई है, इसका उपयोग पाठ युक्त अक्षरों के ब्लॉक से बचने के लिए किया जाता है जिसे अन्यथा मार्कअप के रूप में पहचाना जाएगा
bjan

1
इसलिए हम कुछ HTML को XML डॉक्यूमेंट में स्मगल करने के लिए CDATA का उपयोग कर सकते हैं, ताकि HTML XML डॉक्यूमेंट संरचना को भ्रमित न करें, और फिर इसे बाहर निकालने के लिए XSLT का उपयोग करें और इसे एक HTML डॉक्यूमेंट में थूकें जो आउटपुट हो रहा है।
कज़

69

एक बड़ा उपयोग-मामला: आपके xml में एक प्रोग्राम शामिल है, डेटा के रूप में (उदाहरण के लिए जावा के लिए एक वेब-पेज ट्यूटोरियल)। उस स्थिति में आपके डेटा में वर्णों का एक बड़ा हिस्सा शामिल होता है जिसमें 'और' और '<' शामिल होते हैं, लेकिन उन वर्णों को 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 फाइल में चाहते हैं, w / o उन्हें XML टैग्स / विशेषताओं के साथ भ्रमित करें। जैसा कि @paary ने उल्लेख किया है, अन्य आम उपयोगों में शामिल हैं जब आप URL को एम्बेड कर रहे होते हैं जिसमें एम्परसेंड होते हैं। अंत में, भले ही डेटा में केवल कुछ विशेष वर्ण हों, लेकिन डेटा बहुत लंबा है (एक अध्याय का पाठ, कहते हैं), यह अच्छा नहीं है कि आप अपनी एक्सएमएल फ़ाइल को संपादित करने के लिए उन कुछ संस्थाओं को एन-डी-कोडिंग करें। ।

(मुझे संदेह है कि टिप्पणियों की सभी तुलना थोड़े भ्रामक / अनैतिक हैं।)


41

मुझे एक बार CDATA का उपयोग करना पड़ा था जब मेरे xml तत्व को HTML कोड स्टोर करने की आवश्यकता थी। कुछ इस तरह

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

तो CDATA का अर्थ है कि यह किसी भी वर्ण को अनदेखा करेगा, जिसे अन्यथा XML टैग जैसे <और> आदि के रूप में व्याख्या किया जा सकता है।


2
पहले वाक्य में "टैग" नहीं बल्कि तत्व।
लुडोविक कूट

32

इसमें निहित डेटा को XML के रूप में पार्स नहीं किया जाएगा, और इस तरह के वैध XML होने की आवश्यकता नहीं है या इसमें ऐसे तत्व शामिल हो सकते हैं जो XML हो सकते हैं लेकिन नहीं हैं।


16

विकिपीडिया से:

[में] एक XML दस्तावेज़ या बाहरी पार्स की गई इकाई, एक CDATA अनुभाग तत्व सामग्री का एक भाग है जिसे पार्सर के लिए केवल वर्ण डेटा के रूप में व्याख्या करने के लिए चिह्नित किया जाता है, मार्कअप नहीं।

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

इस प्रकार: सीडीएटीए के अंदर पाठ पार्सर द्वारा देखा जाता है, लेकिन केवल पात्रों के रूप में एक्सएमएल नोड्स के रूप में नहीं।


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 टैग काम नहीं करते - मुझे लगता है कि यह आरएसएस रीडर पर निर्भर करता है जिसका आप उपयोग कर रहे हैं।


और इस उदाहरण के लिए एक स्पष्टीकरण के रूप में कि सीडीटा (और उपयुक्त पबडाटा और डीसी: निर्माता टैग) का उपयोग क्यों किया जाता है: यह एक आरएसएस विजेट का उपयोग करके वेबसाइट प्रदर्शन के लिए है जिसके लिए हमारे पास कोई वास्तविक स्वरूपण नियंत्रण नहीं है।

यह हमें शामिल किए गए चित्र की ऊंचाई और स्थिति को निर्दिष्ट करने में सक्षम बनाता है, एक नए विजेट की आवश्यकता के बिना, लेखक के नाम और तिथि को सही ढंग से प्रारूपित करता है, और आगे। इसका मतलब यह भी है कि मैं इसे स्क्रिप्ट कर सकता हूं और उन्हें हाथ से नहीं जोड़ना है।


9

CDATA का अभिप्राय चरित्र डेटा से है। आप कुछ वर्णों से बचने के लिए इसका उपयोग कर सकते हैं जो अन्यथा नियमित XML के रूप में माना जाएगा। इसके अंदर के डेटा को पार्स नहीं किया जाएगा। उदाहरण के लिए, यदि आप उस URL को पास करना चाहते हैं जिसमें &यह शामिल है, तो आप इसे करने के लिए CDATA का उपयोग कर सकते हैं। अन्यथा, आपको एक त्रुटि मिलेगी क्योंकि इसे नियमित एक्सएमएल के रूप में पार्स किया जाएगा।


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 के पास बाइनरी के साथ कुछ भी करने के लिए सीधे कुछ भी नहीं है।
जोएल म्यूलर

1

Cdata एक डेटा है जिसे आप एक xml पार्सर में पारित करना चाहते हैं और अभी भी एक xml के रूप में व्याख्या नहीं की जा सकती है।

उदाहरण के लिए कहें: - आपके पास एक xml है जिसमें प्रश्न / उत्तर ऑब्जेक्ट को एनकैप्सुलेट किया गया है। ऐसे खुले क्षेत्रों में कोई भी डेटा हो सकता है जो मूल डेटा प्रकार या xml परिभाषित कस्टम डेटा प्रकारों के तहत कड़ाई से नहीं आता है। जैसे - क्या यह xml टिप्पणी के लिए एक सही टैग है? .-- आपको इसे पास करने की आवश्यकता हो सकती है क्योंकि इसे बिना किसी अन्य बाल तत्व के रूप में xml पार्सर द्वारा व्याख्या किया जा सकता है। यहाँ Cdata अपने बचाव के लिए आता है। Cdata के रूप में घोषित करके आप पार्सर को xml के रूप में लिपटे डेटा का इलाज नहीं करते हैं (हालांकि यह एक जैसा लग सकता है)


0

ध्यान दें कि CDATAXML पाठ फ़ाइल में सीधे पाठ रखने पर ही निर्माण की आवश्यकता होती है।

यही है, आपको केवल उपयोग करने की आवश्यकता है CDATAयदि हाथ टाइपिंग या प्रोग्रामेटिक रूप से सीधे एक्सएमएल पाठ का निर्माण।

DOM प्रोसेसर API या SimpleXML का उपयोग करके दर्ज किया गया कोई भी पाठ XML सामग्री नियमों के गलत तरीके से चलने से रोकने के लिए स्वचालित रूप से बच जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.