XML에서 <! [CDATA []]>는 무엇을 의미합니까?


1014

파일 에서이 이상한 CDATA태그를 자주 찾습니다 XML.

<![CDATA[some stuff]]>

나는이 CDATA태그가 항상 처음에 온 다음에 몇 가지 것들이 있음을 관찰했습니다 .

그러나 때로는 사용되지만 때로는 그렇지 않습니다. 나는 그것이 some stuff그 후에 삽입 될 "데이터"임을 표시한다고 가정 한다. 그러나 어떤 종류의 데이터 some stuff입니까? XML 태그에 어떤 종류의 데이터를 쓰지 않습니까?

답변:


951

CDATA문자 데이터를 나타내며 이러한 문자열 사이의 데이터에는 XML 마크 업으로 해석 수 있지만 그렇지 않아야 하는 데이터가 포함됨을 의미 합니다.

CDATA와 주석의 주요 차이점은 다음과 같습니다.

이는 잘 구성된 하나의 문서에서 다음과 같은 4 가지 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 섹션을 ]]하고는 >- 볼 이 답변 괜찮나과 이유들에 대한합니다.
Sean Vieira

2
CDATA 시작과 원시 데이터 사이에 줄 바꾸기 문자가 있어야합니까?
Ben Sewards

2
@BenSewards는 없습니다
Sean Vieira

5
따라서 C와 같은 코드는 CDATA 섹션에 쉽게 넣을 수 없습니다 if (a[b[c]]>10) { }.
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>

A와 다음을 저장하려고 .xhtml파일 ( 하지 .html )와 파이어 폭스 (사용하여 열 수 없습니다 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 파서를 사용하여 유효하지 않은 문자로 선언했습니다. "type ="xs : string ""으로 선언 된 xsd가 있습니다. 인코딩 또는 XML 버전과 관련이 있습니까?
bjan

CDATA는 구문 분석되고 유효한 문자 범위 만 여기에 허용되며, 마크 업으로 인식되는 문자를 포함하는 텍스트 블록을 이스케이프하는 데 사용됩니다.
bjan

1
따라서 CDATA를 사용하여 일부 HTML을 XML 문서에 밀입시켜 HTML이 XML 문서 구조를 혼동하지 않게 한 다음 XSLT를 사용하여 HTML 문서를 꺼내 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

XML 요소를 저장하기 위해 xml 요소가 필요할 때 CDATA를 사용해야했습니다. 같은 것

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

따라서 CDATA는 <및> 등과 같은 XML 태그로 해석 될 수있는 모든 문자를 무시 함을 의미합니다.


2
첫 번째 문장에서 "태그"가 아니라 요소입니다.
Ludovic Kuty

32

여기에 포함 된 데이터는 XML로 구문 분석되지 않으므로 유효한 XML 일 필요는 없으며 XML로 보이지만 그렇지 않은 요소를 포함 할 수 있습니다.


16

Wikipedia에서 :

XML 문서 또는 외부 파싱 된 엔티티에서 CDATA 섹션은 파서가 마크 업이 아닌 문자 데이터로만 해석하도록 표시되는 요소 컨텐츠의 섹션입니다.

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

따라서 CDATA 내부의 텍스트는 파서에 의해 표시되지만 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 리더는 설명을 가져와 CDATA 내에서 HTML을 렌더링합니다.

참고-모든 HTML 태그가 작동하는 것은 아닙니다. 사용중인 RSS 리더에 따라 다릅니다.


그리고이 예제가 CData를 사용하는 이유에 대한 설명으로 (적절한 pubData 및 dc : creator 태그가 아님) : 실제 형식 지정 제어가없는 RSS 위젯을 사용하여 웹 사이트를 표시하기위한 것입니다.

이를 통해 새 위젯이 없어도 포함 된 이미지의 높이와 위치를 지정하고 작성자 이름과 날짜의 형식을 올바르게 지정할 수 있습니다. 또한 스크립트를 작성하여 직접 추가 할 필요가 없습니다.


9

CDATA는 문자 데이터를 나타냅니다. 이를 사용하면 일부 문자를 이스케이프하여 일반 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 파서에서 다른 자식 요소로 해석하지 않고 그대로 전달해야 할 수도 있습니다. 여기 Cdata는 당신의 구조에 온다. Cdata로 선언하면 파서에게 래핑 된 데이터를 XML로 취급하지 않는다고 말하고 있습니다 (하나처럼 보일 수 있음)


0

점을 유의 CDATAXML 텍스트 파일에 직접 텍스트를 배치 할 경우 구조에만 필요합니다.

즉, CDATA직접 입력하거나 프로그래밍 방식으로 XML 텍스트를 직접 작성 하는 경우 에만 사용해야 합니다.

DOM 프로세서 API 또는 SimpleXML을 사용하여 입력 한 텍스트는 XML 컨텐츠 규칙의 위반을 막기 위해 자동으로 이스케이프됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.