분석기 - xml 파싱 줄 바꿈




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

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

<![CDATA[some stuff]]>

나는이 CDATA 태그가 항상 처음에 왔고 그 다음에 몇 가지가 뒤따른다는 것을 알았다.

그러나 때로는 사용되는 경우가 있습니다. 나는 그것이 some stuff 이 그 후에 삽입 될 "데이터"라는 것을 표시하는 것으로 가정한다. 그러나 어떤 데이터가 some stuff 입니까? XML 태그에 일종의 데이터를 쓰는 것이 아닌가?


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>

다음을 .html 파일이 아닌 .xhtml 파일로 저장하고 Internet Explorer가 아닌 FireFox를 사용하여 열어서 주석과 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/ . http://jsfiddle.net/9NNHA/


CDATA는 문자 데이터를 나타냅니다. 이것을 사용하면 정규 XML로 취급되는 일부 문자를 이스케이프 처리 할 수 ​​있습니다. 이 내부의 데이터는 파싱되지 않습니다. 예를 들어 & 를 포함하는 URL을 전달하려는 경우 CDATA를 사용하여이를 수행 할 수 있습니다. 그렇지 않으면 일반 XML로 구문 분석 될 때 오류가 발생합니다.


거기에 포함 된 데이터는 XML로 파싱되지 않으며 유효한 XML 일 필요가 없으며 XML로 보일 수도 있지만 그렇지 않은 요소를 포함 할 수 있습니다.


그것의 또 다른 예로서 ...

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 리더는 설명을 가져 와서 HTML을 CDATA 내에 렌더링합니다.

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

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

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


위키 백과에서 :

[In] XML 문서 또는 외부 파싱 된 엔티티 인 CDATA 섹션은 파서가 마크 업이 아닌 문자 데이터로만 해석되도록 표시된 요소 내용의 섹션입니다.

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

따라서 CDATA 내부의 텍스트는 파서에서 볼 수 있지만 XML 노드가 아닌 문자로만 나타납니다.


일반적으로 그림이나 사운드 데이터와 같은 사용자 지정 데이터를 XML 문서에 포함하는 데 사용됩니다.


하나의 큰 유스 케이스 : 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 파일을 편집 할 때 해당 소수의 엔티티를 인코딩 / 인코딩 해제하지 않아도됩니다. .

(나는 코멘트에 대한 모든 비교가 다소 오도 된 / 도움이되지 않는다고 생각합니다.)


CDATACharacter Data (문자 데이터)의 약자로,이 문자열 사이의 데이터에는 XML 마크 업으로 해석 될 수 있는 데이터가 포함되지만 반드시 있으면 안됩니다.

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

  • 리차드가 지적한 바와 같이, 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>






cdata