2009-03-20 5 views
3

올바른 (올바른 형식의) XML 문서입니까? 문제에서XHTML 엔티티 인코딩은 CDATA 태그 안에 포함되어있는 한 XML 문서에서 유효합니까?

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&copy;</inner> 
</outer> 

은 HTML/XHTML "©"엔티티 인코딩이 더 DTD하거나 정의하는 스키마가없는 XML 문서에서 유효한지 여부이다. 위의 내용을 표현하는 또 다른 방법은이 말을하는 것입니다 : 것 같다

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&#169;</inner> 
</outer> 

는 UTF-8 인코딩으로 유효한 XML이 될 수 있습니다. "& 사본"

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[&copy;]]></inner> 
</outer> 
위의 저자는 위의 문자열로 저작권 기호를 통과해야 XML 파서에 표시하고자

:

그러나

이 유효 적절한 유니 코드 문자가 아닌.

이 점에 대해 나는 약간 혼란스러워한다. 'XML 문서의 새로운 저자는 처리 중에 평범한 문자 데이터로 취급되지 않도록 데이터를 "보호"하는 것으로 잘못 생각하면서 CDATA 섹션의 목적을 종종 잘못 이해합니다. . [그러나] 문자 데이터는 문자 데이터 (CDATA 섹션 또는 일반 마크 업을 통해 표현되는지 여부에 관계없이)입니다. "(From Wikipedia)

저는 두 번째 저자에서 제안 된 XML 형식을 별도로 찾고 있습니다.이 형식은 태그가, 예를 들어, 숫자 만 포함 할 수도 CDATA 섹션에서 태그입니다.

는 XML 전문가가 CDATA의 목적에 혼란을 정리하는 데 도움 수 있기를 바랍니다.

감사합니다!

답변

7

CDATA 섹션은 일반적으로 XML 문서에서 특별한 방식으로 해석되는 리터럴 텍스트를 허용하기위한 것입니다. 즉, 엔티티 참조 또는 XML 태그처럼 보이는 무언가입니다. CDATA 섹션의 내용은 CDATA 섹션없이 유효한 XML 내부에있을 수 있습니다. 다양한 특수 문자를 인코딩하기 위해 엔터티 참조를 사용해야 XML 태그로 취급되지 않고 태그 값인 문자 데이터로 사용됩니다.

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[&copy;]]></inner> 
</outer> 

여기서 inner 요소의 값이 XML 파서에 의해 해석되지 않습니다 값 &copy;은 다음과 같습니다

그래서 예, 다음은 당신이하고자하는 것입니다만큼 완벽하게 유효 저작권 기호에 대한 엔티티 참조로 사용됩니다. 당신은 또한 다음과 같은 작업을 수행 할 수

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&lt;normally&gt; this looks &lt;like/&gt; &amp;amp; xml &lt;/normally&gt;</inner> 
</outer> 

훨씬 적다 인간 - 다음 inner 요소의 값이

<normally> this looks <like/> &amp; xml </normally> 

는 CDATA 섹션없이이 작업을 수행하는 것입니다

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[<normally> this looks <like/> &amp; xml </normally>]]></inner> 
</outer> 

XML 파서 (parser)에 관한 한 읽기 쉽지만 동등하다. 당신이 이런 짓을하면합니다 (inner 요소가 문자열이 아닌 XML을 포함하는 등의 스키마 또는 DTD를 정의한다고 가정) 다음 XML 파서는 불평 할 것이다 :

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><normally> this looks <like/> &amp; xml </normally></inner> 
</outer> 

은 그래서 당신은을 보호하기 위해 탈출 CDATA이나 단체를 사용 XML 파서의 특수 문자를 사용하여 XML 데이터의 클라이언트가 XML 마크 업 문자를 포함하는 inner의 값을 가져올 수 있습니다.

참고 : 명확하게하기 위해, 위의 예는 XML을 형성되지만, 스키마 또는 DTD는 요소 inner가 XSD 포함 말한다면 : 문자열 또는 동급을, 다음은 무효 XML 문서입니다.

XML의 일부로 정의되지 않은 HTML 또는 XHTML 엔터티는 정의되지 않은 한 유효한 XML이 아닙니다. XML 파서가 오류를 반환합니다.

+0

마지막 예가 잘 형성되어있는 것 아닌가요? 방금 적용한 DTD 또는 XSD가 중첩 된 태그를 허용해야한다고 말하는 것입니다 ... 그냥 이해했는지 확인하고 싶습니다. :-) –

+0

예, 마지막 예제 *는 잘 구성된 XML이지만 스키마 또는 DTD가 "내부"태그의 내용이 문자 데이터이고 다른 요소가 아니라고 말하는 경우 잘못된 XML 일 수 있습니다. – Eddie

+0

귀하의 의견에 대한 답변으로 asnwer를 업데이트했습니다. – Eddie

1

내용 CDATA 블록의 XML 구문 분석기이므로 유효성 검사 및 구문 분석과 관련하여 CDATA에 원하는 내용을 넣을 수 있습니다.

물론 CDATA는 으로 임의로 처리됩니다.이므로 XML에 ©이 실제로 나타나기를 원하면이 작업은 수행되지 않습니다. 이미지에서 이미지 파서로 base64로 인코딩 된 바이너리 데이터를로드하는 것처럼 CDATA의 내용을 X/HTML 파서에로드 할 계획이라고 가정합니다. XML 구문 분석기는 CDATA 블록의 내용에서 의미를 추출하려고 시도하지 않습니다. &copy;과 같이 "foo"라고 말할 수도 있습니다.

위키 피 디아의 견적은 혼동스럽게 말하고있는 것처럼 보입니다.

+1

아니요, 무시되지 않고 텍스트 그대로 응용 프로그램에 문자 그대로 전달됩니다. – bortzmeyer

5

Eddie는 좋은 답변을 전했는데, 나는 그가 분명히 언급하지 않은 몇 가지 점을 완성했습니다.

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&copy;></inner> 
</outer> 

는 (전용 "LT", "있다"와 "quot"XML에있는 미리 정의되지 않은 엔티티 "복사") 법이 아니다.

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&#169;</inner> 
</outer> 

은 완벽하게 합법적이고 아마 당신은 (저작권 기호를) 원하는 것을 제공합니다.

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[&copy;]]></inner> 
</outer> 

도 완벽하게 합법적이지만 매우 다른 결과를 산출합니다 ( 요소 <inner> 여섯 개 유니 코드 문자 대신 앞의 예에서 하나를 포함합니다).

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE outer[ 
<!ENTITY copy "&#169;"> 
]> 
<outer> 
    <inner>&copy;></inner> 
</outer> 

도 합법적이고, 두 번째 예와 동일한 결과를 제공한다. 은 키보드/편집기로 을 생성하기가 쉽지만 쉬운 문자를 입력하지 않아도됩니다.

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>©</inner> 
</outer> 

은 (인코딩 = "UTF-8"인코딩 =와 "US-ASCII", 그것은 이 불가능했을 것이기 때문에)도, 법적, 그리고 같은 결과를 제공합니다. 키보드/편집기를 사용하면이 문자를 직접 사용할 수 있습니다.