<! [CDATA []]> ใน XML หมายถึงอะไร


1014

ฉันมักจะพบCDATAแท็กแปลก ๆ นี้ในXMLไฟล์:

<![CDATA[some stuff]]>

ฉันสังเกตว่าCDATAแท็กนี้มักมาที่จุดเริ่มต้นแล้วตามด้วยบางสิ่ง

แต่บางครั้งก็มีการใช้งานบางครั้งก็ไม่ได้ ฉันคิดว่ามันคือการทำเครื่องหมายที่some stuffเป็น "ข้อมูล" ที่จะถูกแทรกหลังจากนั้น แต่ข้อมูลประเภทsome stuffใด มีอะไรที่ฉันเขียนในแท็ก XML เป็นข้อมูลบางประเภทใช่ไหม

คำตอบ:


951

CDATAย่อมาจากData Characterและหมายความว่าข้อมูลในระหว่างสตริงเหล่านี้รวมถึงข้อมูลที่สามารถตีความได้ว่าเป็นมาร์กอัป XML แต่ไม่ควรจะเป็น

ความแตกต่างที่สำคัญระหว่าง CDATA และความคิดเห็นคือ:

นี่หมายความว่าให้ตัวอย่าง 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
คุณต้องมีสองส่วนของ CDATA เพื่อเชื่อมต่อ]]และ>- ดูคำตอบนี้สำหรับความชำนาญและ whys
Sean Vieira

2
จะต้องมีอักขระบรรทัดใหม่ระหว่าง CDATA start และข้อมูลดิบหรือไม่
Ben Sewards

2
ไม่มีไม่มี @BenSewards
Sean Vieira

5
ดังนั้นชิ้นนี้ C-เช่นรหัสไม่สามารถได้อย่างง่ายดายจะใส่ในส่วน if (a[b[c]]>10) { }CDATA:
Anders Tornblad

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

10
@bjan - อะไรทำให้คุณคิดว่านั่นเป็นตัวละครที่ผิดกฎหมาย? ดูเหมือนว่าคุณอาจมีปัญหาการเข้ารหัส
Richard JP Le Guen

ฉันเปิดเอกสารใน IE ฉันยังใช้ตัวแยกวิเคราะห์ MSXML ซึ่งประกาศว่าเป็นอักขระที่ไม่ถูกต้อง ฉันมี xsd ซึ่งประกาศเป็น "type =" xs: string "" มันเกี่ยวข้องกับการเข้ารหัสหรือเวอร์ชั่น xml หรือไม่?
bjan

CDATA ถูกแยกวิเคราะห์และอนุญาตให้ใช้ช่วงอักขระที่ถูกต้องเท่านั้นเช่นกันมันถูกใช้เพื่อหลบหนีบล็อกข้อความที่มีอักขระซึ่งจะถูกจดจำเป็นมาร์กอัป
bjan

1
ดังนั้นเราสามารถใช้ CDATA เพื่อลักลอบ HTML บางส่วนลงในเอกสาร XML เพื่อที่ HTML จะไม่สร้างความสับสนให้กับโครงสร้างเอกสาร XML แล้วใช้ XSLT ในภายหลังเพื่อดึงมันออกมาและแยกเป็นเอกสาร HTML ที่กำลังส่งออก
Kaz

69

กรณีใช้งานขนาดใหญ่หนึ่งรายการ: 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 ของคุณ .

(ฉันสงสัยว่าการเปรียบเทียบความคิดเห็นทั้งหมดมีความเข้าใจผิด / ไม่ช่วยเหลือ)


41

ฉันเคยต้องใช้ CDATA เมื่อองค์ประกอบ xml ของฉันต้องการเก็บรหัส HTML สิ่งที่ต้องการ

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

ดังนั้น CDATA หมายความว่ามันจะไม่สนใจอักขระใด ๆ ที่สามารถตีความได้ว่าเป็นแท็ก XML เช่น <และ> เป็นต้น


2
ไม่ใช่ "แท็ก" แต่เป็นองค์ประกอบในประโยคแรก
Ludovic Kuty

32

ข้อมูลที่อยู่ในนั้นจะไม่ถูกแยกวิเคราะห์เป็น XML และไม่จำเป็นต้องเป็น XML ที่ถูกต้องหรืออาจมีองค์ประกอบที่อาจดูเหมือนเป็น XML แต่ไม่ใช่


16

จาก Wikipedia:

[ใน] เอกสาร XML หรือเอนทิตี้การวิเคราะห์คำภายนอกส่วน CDATA เป็นส่วนของเนื้อหาองค์ประกอบที่ทำเครื่องหมายเพื่อให้ parser ตีความเป็นข้อมูลอักขระเท่านั้นไม่ใช่มาร์กอัป

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

ดังนั้น: ข้อความภายใน CDATA จะเห็นโดย parser แต่จะเห็นได้เฉพาะอักขระที่ไม่ใช่โหนด XML


13

เป็นอีกตัวอย่างหนึ่งของการใช้งาน:

หากคุณมี RSS Feed (เอกสาร 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 ที่เราไม่มีการควบคุมการจัดรูปแบบจริง

สิ่งนี้ช่วยให้เราสามารถระบุความสูงและตำแหน่งของรูปภาพที่รวมจัดรูปแบบชื่อผู้แต่งและวันที่อย่างถูกต้องและอื่น ๆ โดยไม่จำเป็นต้องใช้วิดเจ็ตใหม่ นอกจากนี้ยังหมายความว่าฉันสามารถเขียนสคริปต์นี้และไม่ต้องเพิ่มด้วยมือ


9

CDATA ย่อมาจาก Data Character คุณสามารถใช้วิธีนี้เพื่อหลีกเลี่ยงอักขระบางตัวซึ่งจะถือว่าเป็น XML ปกติ ข้อมูลภายในสิ่งนี้จะไม่ถูกแยกวิเคราะห์ ตัวอย่างเช่นหากคุณต้องการส่ง 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 parser เป็นองค์ประกอบลูกอีก Cdata มาที่นี่เพื่อช่วยเหลือคุณ เมื่อประกาศเป็น Cdata คุณกำลังบอกตัวแยกวิเคราะห์ว่าไม่ถือว่าข้อมูลที่ถูกห่อเป็น xml (แม้ว่ามันจะดูเหมือนเป็นหนึ่งเดียว)


0

โปรดทราบว่าการCDATAสร้างจำเป็นต้องมีก็ต่อเมื่อวางข้อความลงในไฟล์ข้อความ XML โดยตรง

นั่นคือคุณจะต้องใช้เฉพาะCDATAเมื่อพิมพ์ด้วยมือหรือสร้างข้อความ XML โดยตรงโดยทางโปรแกรม

ข้อความใด ๆ ที่ป้อนโดยใช้ตัวประมวลผล DOM API หรือ SimpleXML จะถูกหลีกเลี่ยงโดยอัตโนมัติเพื่อป้องกันการทำงานที่ผิดกฎของเนื้อหา XML

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.