DTD에서 PCDATA와 CDATA의 차이점


88

차이 무엇 #PCDATA#CDATADTD는 ?



XML DTD에서 사용되는 키워드의 이름은 #PCDATACDATA입니다. 더 없습니다 PCDATA키워드 더는 #CDATA.
mzjn

1
허용 된 답변 외에도 CDATA 속성 유형과 <! [CDATA []]> 표시된 섹션의 차이점을 설명하므로 stackoverflow.com/a/918462/2013911 을 읽어야 합니다.
Niklas Peter

답변:


76

PCDATA-구문 분석 된 문자 데이터

XML 파서는 일반적으로 XML 문서의 모든 텍스트를 구문 분석합니다.

CDATA-(분석되지 않은) 문자 데이터

CDATA라는 용어는 XML 파서에 의해 구문 분석되지 않아야하는 텍스트 데이터에 사용됩니다.

"<"및 "&"와 같은 문자는 XML 요소에서 불법입니다.


78
  • PCDATA파서가 파싱 할 텍스트입니다. 텍스트 내의 태그는 마크 업으로 처리되고 엔티티가 확장됩니다.
  • CDATA파서가 파싱 하지 않을 텍스트입니다 . 텍스트 내부 태그 것 없는 마크 업으로 취급하고 엔티티는 확장되지 않습니다.

기본적으로 모든 것은 PCDATA입니다. 다음 예제에서 루트를 무시하면 <bar>구문 분석되고 콘텐츠는 없지만 자식은 하나입니다.

<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>

요소가 텍스트 만 포함하고 자식 요소는 포함하지 않도록 지정하려는 PCDATA경우이 키워드는 요소가 구문 분석 가능한 문자 데이터를 포함해야 함을 지정하기 때문에 키워드를 사용합니다. 즉, ( <) 보다 작은 문자를 제외한 모든 텍스트 , 보다 큼 ( >), 앰퍼샌드 ( &), 따옴표 ( ') 및 큰 따옴표 ( ").

다음 예에서, <bar>포함 CDATA. 그 내용은 구문 분석되지 않으므로 <test>content!</test>.

<?xml version="1.0"?>
<foo>
<bar><![CDATA[<test>content!</test>]]></bar>
</foo>

SGML에는 여러 콘텐츠 모델이 있습니다. #PCDATA내용 모델은 요소가 일반 텍스트를 포함 할 수 있다고 말한다. "분석 된"부분은 마크 업 (PI, 주석 및 SGML 지시문 포함)이 원시 텍스트로 표시되지 않고 구문 분석됨을 의미합니다. 또한 엔티티 참조가 대체됨을 의미합니다.

일반 텍스트 콘텐츠를 허용하는 또 다른 유형의 콘텐츠 모델은 CDATA. XML에서 요소 콘텐츠 모델은 암시 적으로로 설정되지 않을 수 CDATA있지만 SGML에서는 요소의 콘텐츠에서 마크 업 및 엔티티 참조가 무시됨을 의미합니다. CDATA그러나 유형 속성에서는 엔티티 참조가 대체됩니다.

XML #PCDATA에서 유일한 일반 텍스트 콘텐츠 모델입니다. 요소에 텍스트 내용을 허용하려는 경우 사용합니다. CDATA콘텐츠 모델은 통해 명시 적으로 사용할 수 CDATA있는 블록 마크 업 #PCDATA하지만, 요소의 내용은 다음과 같이 정의 할 수 없습니다 CDATA기본적으로 당.

DTD에서 텍스트가 포함 된 속성의 유형은이어야합니다 CDATA. CDATA속성 선언 의 키워드 CDATA는 XML 문서 의 섹션과 다른 의미를 갖습니다 . A의 CDATA섹션의 모든 문자는 (를 포함하여 합법적 <, >, &, '"를 제외하고, 문자) ]]>종료 태그.

#PCDATA속성 유형에 적합하지 않습니다. "리프"텍스트 유형에 사용됩니다.

#PCDATA이 키워드를 이름이 지정된 요소 PCDATA(완전히 합법적 임) 와 구별하기 위해 컨텐츠 모델에서 해시가 앞에 추가됩니다 .


6
마지막 문장을 제외하고 훌륭한 대답입니다. #해시 태그가 아닙니다. 이 기호가 앞에 오는 태그 만 해시 태그입니다. 기호 자체에는 "숫자 기호", "파운드 기호"(대부분 캐나다 및 미국) 또는 "해시"(따라서 이름 '해시 태그')를 비롯한 많은 이름이 있습니다.

6
#justhadtogetthatoffmychest

3
나는 앞의 # #PCDATA이 역사적인 이유로 거기에 있다는 것에 동의하지 않습니다 . DTD에서 요소는라는 요소도 포함 할 수 있기 때문에 PCDATA가능해야하며 <!ELEMENT foo (PCDATA)>.
Mathias Müller

인용문과 큰 따옴표는 PCDATA 콘텐츠에서 완벽하게 합법적입니다. 그리고 앰퍼샌드가 나타날 수 있지만 (XML에서) 엔티티 소개 자로 만 나타납니다.
Toby Speight 2019

13

PCDATA – 구문 분석 된 문자 데이터. XML 문서의 모든 데이터를 구문 분석합니다.

예:

<family>
    <mother>mom</mother>
    <father>dad</father>
</family>

여기에서 <family>요소에는 2 개의 요소가 더 있습니다. <mother><father>. 따라서 가족의 텍스트 값을 "엄마 아빠" 로 제공하기 위해 어머니와 아버지의 텍스트를 가져 오기 위해 더 구문 분석합니다.

CDATA – 구문 분석되지 않은 문자 데이터. 이것은 xml 문서에서 더 이상 파싱해서는 안되는 데이터입니다.

<family>
    <![CDATA[ 
       <mother>mom</mother>
       <father>dad</father>
    ]]>
</family>

여기서 family의 텍스트 값은 <mother>mom</mother><father>dad</father>.


12

여기에서 ( Google은 당신의 친구입니다 ) :

DTD에서 PCDATA와 CDATA는 각각 요소와 속성의 허용 가능한 내용에 대해 무언가를 주장하는 데 사용됩니다. 요소의 콘텐츠 모델에서 #PCDATA는 요소가 "모든 이전 텍스트"를 포함 (포함 할 수 있음)한다고 말합니다. (아래에 언급 된 예외가 있습니다.) 속성의 선언에서 CDATA는 속성의 허용 가능한 값 (다른 정렬, 모두 상호 배타적, ID, IDREF 및 NMTOKEN 포함)에 지정할 수있는 제약의 한 종류입니다. 허용 가능한 값이 CDATA 인 속성 (예 : 요소의 PCDATA)은 "모든 이전 텍스트"를 포함 할 수 있습니다.

잠재적으로 매우 혼란스러운 문제는 표시된 섹션이라고도하는 또 다른 "CDATA" 가 있다는 것 입니다. 표시된 섹션은 닫는 특수 문자열로 구분 된 요소 (#PCDATA) 콘텐츠의 일부입니다. PCDATA가 "파싱 된 문자 데이터"라는 것을 기억한다면 CDATA 섹션은 "파싱 된"없이 말 그대로 동일합니다. 파서는 <및 &와 같은 특수 문자를 만날 때마다 딸꾹질없이 표시된 섹션의 내용을 다운 스트림 애플리케이션으로 전송합니다. 이것은 특수 문자 (예 : 스크립트 및 코드 조각)가 많이 포함 된 문서를 코딩 할 때 유용합니다. 해당 엔티티 참조보다 데이터 입력과 읽기가 더 쉽습니다.

따라서 "모든 이전 텍스트"규칙에 대한 예외는 PCDATA가 CDATA 표시 섹션의 범위에 속하지 않는 한 이러한 이스케이프되지 않은 특수 문자를 포함 할 수 없다는 것입니다.


3

PCDATA와 CDATA의 가장 큰 차이점은

PCDATA-기본적으로 ELEMENTS에 사용되는 동안

CDATA-XML 속성, 즉 ATTLIST에 사용


0

CDATA ( C haracter DATA ) : 주석과 유사하지만 문서의 일부입니다. 즉, CDATA는 데이터이고 문서의 일부이지만 데이터는 XML로 구문 분석 할 수 없습니다.
참고 : XML 주석은 XML을 구문 분석하는 동안 생략되지만 CDATA는있는 그대로 표시됩니다.

PCDATA ( P arsed C haracter DATA ) : 기본적으로 모든 것이 PCDATA입니다. PCDATA는 데이터이며 XML로 구문 분석 할 수 있습니다.

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