<! [CDATA []]> trong XML có nghĩa là gì?


1014

Tôi thường tìm thấy CDATAthẻ lạ này trong XMLcác tập tin:

<![CDATA[some stuff]]>

Tôi đã quan sát thấy rằng CDATAthẻ này luôn xuất hiện ở đầu, và sau đó là một số thứ.

Nhưng đôi khi nó được sử dụng, đôi khi không. Tôi giả sử nó là để đánh dấu đó some stufflà "dữ liệu" sẽ được chèn vào sau đó. Nhưng loại dữ liệu là some stuffgì? Không có gì tôi viết trong thẻ XML một số loại dữ liệu?

Câu trả lời:


951

CDATA là viết tắt của Dữ liệu ký tự và điều đó có nghĩa là dữ liệu ở giữa các chuỗi này bao gồm dữ liệu có thể được hiểu là đánh dấu XML, nhưng không nên.

Sự khác biệt chính giữa CDATA và ý kiến ​​là:

  • Như Richard chỉ ra , CDATA vẫn là một phần của tài liệu, trong khi một bình luận thì không.
  • Trong CDATA, bạn không thể bao gồm chuỗi ]]>( CDEnd), trong khi trong một nhận xét --là không hợp lệ .
  • Tham số thực thể tham chiếu không được công nhận bên trong các ý kiến.

Điều này có nghĩa là đã đưa ra bốn đoạn XML này từ một tài liệu được định dạng tốt:

<!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
Làm thế nào một nhân vật của chuỗi CEND có thể thoát được?
Thomas Weller

23
Bạn phải có hai phần CDATA để ghép nối ]]>- xem câu trả lời này cho các cung và các whys.
Sean Vieira

2
có phải có một ký tự dòng mới ở giữa CDATA bắt đầu và dữ liệu thô không?
Bến Sewards

2
Không, không có @BenSewards
Sean Vieira

5
Vì vậy, đoạn mã giống như C này không thể dễ dàng được đặt trong phần CDATA : if (a[b[c]]>10) { }.
Anders Tornblad

341

Phần CDATA là " một phần nội dung phần tử được đánh dấu để trình phân tích cú pháp diễn giải dưới dạng dữ liệu ký tự, không phải đánh dấu. "

Cú pháp, nó hoạt động tương tự như một nhận xét:

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

... nhưng nó vẫn là một phần của tài liệu:

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

Hãy thử lưu các .xhtmltệp sau dưới dạng tệp ( không phải .html ) và mở tệp bằng FireFox ( không phải Internet Explorer ) để xem sự khác biệt giữa phần bình luận và phần CDATA; bình luận sẽ không xuất hiện khi bạn xem tài liệu trên trình duyệt, trong khi phần CDATA sẽ:

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

Một điều cần lưu ý với các phần CDATA là chúng không có mã hóa, vì vậy không có cách nào để đưa chuỗi ]]>vào chúng. Bất kỳ dữ liệu ký tự nào chứa ]]>sẽ phải - theo như tôi biết - thay vào đó là một nút văn bản. Tương tự, từ góc độ thao tác DOM, bạn không thể tạo phần CDATA bao gồm ]]>:

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

Mã thao tác DOM này sẽ đưa ra một ngoại lệ (trong Firefox) hoặc dẫn đến một tài liệu XML có cấu trúc kém: http://jsfiddle.net/9NNHA/


3
Vậy thì tại sao "ý" không được phép trong CDATA?
bjan

10
@bjan - Điều gì khiến bạn nghĩ đó là một nhân vật bất hợp pháp? Âm thanh như bạn có thể có một vấn đề mã hóa.
Richard JP Le Guen

Tôi đã mở tài liệu trong IE, tôi cũng đang sử dụng trình phân tích cú pháp MSXML đã khai báo nó là một ký tự không hợp lệ. Tôi có một xsd trong đó nó được khai báo là "type =" xs: string "". Có liên quan với phiên bản mã hóa hoặc xml?
bjan

CDATA được phân tích cú pháp và chỉ có phạm vi ký tự hợp lệ cũng được cho phép ở đây, nó được sử dụng để thoát khỏi các khối văn bản có chứa các ký tự thường được nhận dạng là đánh dấu
bjan

1
Vì vậy, chúng ta có thể sử dụng CDATA để chuyển một số HTML vào tài liệu XML, do đó HTML không gây nhầm lẫn cấu trúc tài liệu XML, sau đó sử dụng XSLT sau đó để kéo nó ra và nhổ nó vào tài liệu HTML đang được xuất ra.
Kaz

69

Một trường hợp sử dụng lớn: xml của bạn bao gồm một chương trình, dưới dạng dữ liệu (ví dụ: hướng dẫn trang web cho Java). Trong tình huống đó, dữ liệu của bạn bao gồm một khối lớn các ký tự bao gồm '&' và '<' nhưng các ký tự đó không có nghĩa là xml.

Đối chiếu:

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

với

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

Đặc biệt nếu bạn đang sao chép / dán mã này từ một tệp (hoặc bao gồm nó, trong bộ xử lý trước), thật tuyệt khi chỉ có các ký tự bạn muốn trong tệp xml của bạn, không nhầm lẫn chúng với các thẻ / thuộc tính XML. Như @paary đã đề cập, các cách sử dụng phổ biến khác bao gồm khi bạn nhúng URL có chứa ký hiệu. Cuối cùng, ngay cả khi dữ liệu chỉ chứa một vài ký tự đặc biệt nhưng dữ liệu rất dài (văn bản của một chương, giả sử), thật tuyệt khi không phải mã hóa vài thực thể đó khi bạn chỉnh sửa tệp xml của mình .

(Tôi nghi ngờ tất cả các so sánh với các bình luận là sai lệch / không có ích.)


41

Tôi đã từng phải sử dụng CDATA khi yếu tố xml của tôi cần lưu trữ mã HTML. Cái gì đó như

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

Vì vậy, CDATA có nghĩa là nó sẽ bỏ qua bất kỳ ký tự nào có thể được hiểu là thẻ XML như <và>, v.v.


2
Không phải "tag" mà là yếu tố trong câu đầu tiên.
Ludovic Kuty

32

Dữ liệu chứa trong đó sẽ không được phân tích cú pháp dưới dạng XML và do đó không cần phải là XML hợp lệ hoặc có thể chứa các phần tử có vẻ như là XML nhưng không phải.


16

Từ Wikipedia:

[Trong] một tài liệu XML hoặc thực thể được phân tích cú pháp bên ngoài, phần CDATA là một phần của nội dung phần tử được đánh dấu để trình phân tích cú pháp diễn giải chỉ là dữ liệu ký tự, không phải đánh dấu.

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

Do đó: văn bản bên trong CDATA được trình phân tích cú pháp nhìn thấy nhưng chỉ là các ký tự không phải là các nút XML.


13

Một ví dụ khác về việc sử dụng nó:

Nếu bạn có Nguồn cấp RSS (tài liệu xml) và muốn bao gồm một số mã hóa HTML cơ bản trong màn hình mô tả, bạn có thể sử dụng CData để mã hóa nó:

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

Trình đọc RSS kéo theo mô tả và hiển thị HTML trong CDATA.

Lưu ý - không phải tất cả các thẻ HTML đều hoạt động - Tôi nghĩ rằng nó phụ thuộc vào trình đọc RSS bạn đang sử dụng.


Và như một lời giải thích cho lý do tại sao ví dụ này sử dụng CData (chứ không phải thẻ pubData và dc: creator thích hợp): đây là để hiển thị trang web bằng cách sử dụng tiện ích RSS mà chúng tôi không có kiểm soát định dạng thực.

Điều này cho phép chúng tôi chỉ định chiều cao và vị trí của hình ảnh được bao gồm, định dạng chính xác tên tác giả và ngày, v.v., mà không cần một widget mới. Nó cũng có nghĩa là tôi có thể viết kịch bản này và không phải thêm chúng bằng tay.


9

CDATA là viết tắt của Dữ liệu ký tự. Bạn có thể sử dụng điều này để thoát một số ký tự mà nếu không sẽ được coi là XML thông thường. Dữ liệu bên trong này sẽ không được phân tích cú pháp. Ví dụ: nếu bạn muốn truyền một URL có &trong đó, bạn có thể sử dụng CDATA để làm điều đó. Nếu không, bạn sẽ gặp lỗi vì nó sẽ được phân tích cú pháp như XML thông thường.


6

Nó được sử dụng để chứa dữ liệu có thể được xem là xml vì nó chứa các ký tự nhất định.

Bằng cách này, dữ liệu bên trong sẽ được hiển thị, nhưng không được diễn giải.


5

Nó thoát khỏi một chuỗi không thể truyền sang XML như bình thường:

Thí dụ:

Chuỗi chứa "&" trong đó.

Bạn không thể:

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

Do đó, bạn phải sử dụng CDATA:

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

1

Thường được sử dụng để nhúng dữ liệu tùy chỉnh, như hình ảnh hoặc dữ liệu âm thanh trong tài liệu XML.


3
Mặc dù bạn có thể đặt dữ liệu nhị phân được mã hóa văn bản trong phần CDATA, nhưng bạn không phải làm vậy, vì CDATA không liên quan gì đến nhị phân bất cứ điều gì.
Joel Mueller

1

Cdata là dữ liệu mà bạn có thể muốn chuyển đến trình phân tích cú pháp xml và vẫn không được hiểu là xml.

Nói ví dụ: - Bạn có một xml đã đóng gói đối tượng câu hỏi / câu trả lời. Các trường mở như vậy có thể có bất kỳ dữ liệu nào không hoàn toàn thuộc loại dữ liệu cơ bản hoặc loại dữ liệu tùy chỉnh được xác định xml. Giống như - Đây có phải là một thẻ chính xác cho nhận xét xml? .-- Bạn có thể có một yêu cầu để vượt qua nó như vậy mà không bị trình phân tích xml giải thích như là một phần tử con khác. Ở đây Cdata đến để giải cứu bạn. Bằng cách khai báo là Cdata, bạn đang nói rằng trình phân tích cú pháp không coi dữ liệu được gói dưới dạng xml (mặc dù nó có thể trông giống như một)


0

Lưu ý rằng CDATAcấu trúc chỉ cần thiết nếu đặt văn bản trực tiếp vào tệp văn bản XML.

Nghĩa là, bạn chỉ cần sử dụng CDATAnếu gõ tay hoặc lập trình trực tiếp văn bản XML.

Bất kỳ văn bản nào được nhập bằng API bộ xử lý DOM hoặc SimpleXML sẽ được tự động thoát để tránh phạm lỗi với các quy tắc nội dung XML.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.