XML 문서에서 어떤 문자를 이스케이프해야합니까?


925

XML 문서에서 어떤 문자를 이스케이프해야합니까? 또는 그러한 목록을 어디에서 찾을 수 있습니까?


7
예 :<company>AT&amp;T</company>
jacktrades

기본 소스에서 추출한 간결하고 쉽게 기억할 수있는 안내서 ( W3C Extensible Markup Language (XML) 1.0 (Frith Edition) ) 는 아래의 단순화 된 XML 이스케이프를 참조하십시오 .
kjhughes

답변:


1356

적절한 클래스 나 라이브러리를 사용하면 탈출 할 것입니다. 많은 XML 문제는 문자열 연결로 인해 발생합니다.

XML 이스케이프 문자

5 개만 있습니다 :

"   &quot;
'   &apos;
<   &lt;
>   &gt;
&   &amp;

이스케이프 문자는 특수 문자가 사용되는 위치에 따라 다릅니다.

예제는 W3C Markup Validation Service 에서 확인할 수 있습니다 .

본문

안전한 방법은 텍스트에서 5자를 모두 이스케이프 처리하는 것입니다. 그러나, 세 개의 문자 ", '그리고 >필요없는 텍스트로 이스케이프 :

<?xml version="1.0"?>
<valid>"'></valid>

속성

안전한 방법은 속성에서 다섯 문자를 모두 이스케이프 처리하는 것입니다. 그러나 >특성 에서 캐릭터를 이스케이프 처리 할 필요는 없습니다.

<?xml version="1.0"?>
<valid attribute=">"/>

'따옴표가있는 경우 문자 속성에서 탈출 할 필요가 없다 ":

<?xml version="1.0"?>
<valid attribute="'"/>

마찬가지로 "따옴표가 '다음과 같은 경우 속성에서 이스케이프 처리 할 필요가 없습니다 .

<?xml version="1.0"?>
<valid attribute='"'/>

코멘트

주석에서 5 개의 특수 문자 모두 이스케이프 해서는 안됩니다 .

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

CDATA 섹션 에서 5 개의 특수 문자 모두 이스케이프 해서는 안됩니다 .

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

처리 지침

XML 처리 명령에서 5 개의 특수 문자 모두 이스케이프 해서는 안됩니다 .

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML과 HTML

HTML에는 더 많은 문자를 다루는 자체 이스케이프 코드 세트가 있습니다.


33
@Pacerier, 나는 당신이 당신의 자신의 XML / HTML 이스케이프 코드를 작성하지 않기를 간절히 바란다. 라이브러리 함수를 사용하거나 특별한 경우를 놓칠 수밖에 없습니다.
Jason

5
또한 줄 바꿈의 경우 & # xA; & # xD; & # x9; 속성에 이러한 문자가 필요한 경우 탭
radistao

78
이것에 대해 찾기 / 바꾸기를 할 경우 & amp; 다른 사람보다 먼저 교체하십시오.
Doug

2
@Doug 난 그냥 똑같은 언급하고 있었다 - 그렇지 않으면 다른 모든 대체 문자가 손상됩니다,와 같은 것들 &quot;로 변경됩니다&amp;quot;
제리 닷지

5
Wikipedia에서 : "허용 된 모든 유니 코드 문자는 숫자 참조로 표시 될 수 있습니다." 거기 그래서 더 많은 5 이상
팀 쿠퍼

93

아마도 이것은 도움이 될 것입니다 :

XML 및 HTML 문자 엔티티 참조 목록 :

SGML, HTML 및 XML 문서에서 문자 데이터 및 속성 값으로 알려진 논리적 구성은 문자 시퀀스로 구성되며, 각 문자는 직접 표시하거나 (자체를 대표) 문자 참조라고하는 일련의 문자로 나타낼 수 있습니다. 숫자 참조와 문자 엔티티 참조의 두 가지 유형이 있습니다. 이 기사는 HTML 및 XML 문서에서 유효한 문자 엔티티 참조를 나열합니다.

이 기사에는 다음과 같은 5 개의 사전 정의 된 XML 엔티티가 나열되어 있습니다.

quot  "
amp   &
apos  '
lt    <
gt    >

73

월드 와이드 웹 컨소시엄 (w3C)의 스펙에 따르면 마크 업 구분 기호로 사용되거나 주석, 처리 명령 또는 CDATA 섹션 내에서 사용되는 경우를 제외하고 XML 문서에 리터럴 형식으로 표시되어서는 안되는 5 개의 문자가 있습니다. . 다른 모든 경우에는 다음 표에 따라 해당 엔티티 또는 숫자 참조를 사용하여 이러한 문자를 바꿔야합니다.

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

위에서 언급 된 엔티티는 & apos; XHTML 1.0에서 도입되었으며 HTML 4로 선언되지 않았습니다. 이러한 이유로 인해 레트로 호환성을 위해 XHTML 사양에서는 & # 39; 대신에.


14
XML은 이러한 5 가지 엔티티를 미리 정의하지만 문자 그대로 5 가지 문자를 사용할 수 없다고 명시하지는 않습니다. <및 &는 모든 곳에서 이스케이프되어야합니다 (CDATA 제외). "및 '는 속성 값으로 만 이스케이프 처리해야하며 해당 인용 부호가 동일한 경우에만. 그리고>는 실제로 이스케이프 처리하지 않아야합니다.
Shaun McCance

3
위에서 언급 한 것처럼 마크 업 구분 기호로 사용되거나 주석, 처리 명령 또는 CDATA 섹션 내에서 <> "& '를 이스케이프 처리 할 필요가 없습니다. 즉, <>를 XML 태그로 사용하면 이스케이프 처리하지 않아도됩니다. 주석과 같은 것 (XML 파일의 주석 처리 된 줄에서 &를 이스케이프 처리 할 필요가 있으며 필요하지 않으며 XML이 필요하지 않은 경우에도 여전히 유효합니다.) 이는 공식적인 권장 사항에 명시되어 있습니다. W3C에 의해 XML .
Albz

7
@ShaunMcCance >는 CDATA 섹션의 끝을 나타내는 구분 기호의 ]]일부가 아닌 경우 내용을 따르는 경우 이스케이프되어야합니다 ]]>.
Lee D

2
네크로맨서가 아니지만 @Albz는 이러한 문자가 내용에 열중해야한다고 말하는 것은 잘못되었습니다. w3.org/TR/REC-xml/#NT-CharData의 섹션 2.4를 참조하십시오 . 이것의 TL; DR 버전은 chardata element content에서 & amp; 및 & lt; 항상 열중해야합니다. & gt; 리터럴 문자열 "]]>"에 나타날 때는 반드시 문자를 사용해야하지만 그렇지 않은 경우 CDATA 섹션을 종료하는 것으로 읽 히게됩니다. 작은 따옴표와 큰 따옴표의 경우 원하는 경우 벗어날 수 있습니다. 이것이 요소 내부의 chardata에 대한 것입니다. XML의 다른 구성 요소에는 다른 규칙이 있습니다.
skye-- 캡틴

52

이스케이프 문자는 태그와 속성이 다릅니다.

태그의 경우 :

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

속성의 경우 :

" &quot;
' &apos;

에서 문자 데이터 및 마크 업 :

앰퍼샌드 문자 (&) 및 왼쪽 꺾쇠 괄호 (<)는 마크 업 구분 기호로 사용되거나 주석, 처리 명령 또는 CDATA 섹션 내에서 사용되는 경우를 제외하고 리터럴 형식으로 표시되어서는 안됩니다. 다른 곳에서 필요한 경우 숫자 참조 또는 문자열 "& amp;"및 "& lt;"를 사용하여 이스케이프해야합니다. 직각 괄호 (>)는 문자열 "& gt;"을 사용하여 표시 될 수 있으며, 호환성을 위해 "& gt;"또는 컨텐츠에서 ""]> ""문자열에 나타날 때 문자 참조를 사용하여 이스케이프해야합니다. 해당 문자열이 CDATA 섹션의 끝을 표시하지 않는 경우

속성 값에 작은 따옴표와 큰 따옴표가 모두 포함되도록하려면 아포스트로피 또는 작은 따옴표 문자 ( ')를 "& apos;"로, 큰 따옴표 문자 ( ")를"& quot; ".


이것은 속성의 경우 따옴표 만 이스케이프해야한다는 것을 의미하지만, 다른 세 문자 외에
eug

40

자주 묻는 질문에 대한 새롭고 간단한 답변 ...

간소화 된 XML 이스케이프 (우선 순위, 100 % 완료)

  1. 항상 (90 % 기억해야 함)

    • 탈출 <&lt;하지 않는 <을 시작하고있다 <tag/>.
    • 탈출 &&amp;하지 않는 &을 시작하고있다 &entity;.
  2. 속성 값 (9 % 기억해야 함)

    • attr=" '작은 따옴표 '는 큰 따옴표 안에 있습니다."
    • attr=' ""작은 따옴표 안에 큰 따옴표 가 있습니다.'
    • 탈출 "&quot;'같은 &apos;그렇지.
  3. 주석 , CDATA처리 지침 (0.9 % 기억해야 함)

    • <!--주석 내에서 -->이스케이프 할 필요는 없지만 --문자열은 허용되지 않습니다.
    • <![CDATA[CDATA 내에서 ]]>이스케이프 할 필요는 없지만 ]]>문자열은 허용되지 않습니다.
    • <?PITargetPI 내에서 ?>이스케이프 할 필요는 없지만 ?>문자열은 허용되지 않습니다.
  4. Esoterica (0.1 % 기억해야 함)

    • 탈출 ]]>]]&gt;하지 않는 ]]>CDATA 섹션을 종료한다.
      (이 규칙은 일반적으로 CDATA 섹션 외부에서도 문자 데이터에 적용됩니다.)

주목할만한 다른 규칙 은 CDATA 섹션에없는 경우에도 ]]>로 이스케이프해야합니다 ]]&gt;. 이를 달성하는 가장 쉬운 방법은 항상로 탈출 >하는 것 &gt;입니다.
Michael Kay

감사합니다, @MichaelKay. 나는 당신의 도움이되는 메모를 통합 ]]> 했지만 > 항상 탈출 한다는 것을 제안하기보다는 (이것이 필요하지는 않지만) esoterica에게 그것을 공개하기로 결정했습니다 . XML 이스케이프 규칙을 쉽게 기억 하고 100 % 정확 하도록하는 것이 나의 목표 입니다.
kjhughes

허용 된 하나의 언급을 포함하여 위의 답변은 5 개의 문자 모두 속성 내에서 이스케이프되어야합니다. 논리적으로 정답으로 보이는 말을 뒷받침하는 XML 표준에 대한 언급이 있습니까?
로마 수시

1
@RomanSusi : 그렇습니다. 다른 많은 답변에는 공식 XML BNF에 대한 의견, 오해 또는 오해에 근거한 오류나 과장 ( "안전한 방법 ...")이 포함되어 있습니다. 내 대답은 (a) W3C XML 권장 사항에 의해 100 % 정당화됩니다. 공식 BNF에 대한 많은 연계 된 참조를 참조하고, (b) 이러한 요구 사항의 간결하고 논리적이며 기억하기 쉬운 진행으로 구성되어 있습니다.
kjhughes

@RomanSusi : 특정 문 것을 "다섯 개 문자 속성 안에 탈출해야한다"는 공식 BNF의 규정에 의해 지원되지 않는 실수 안내 인 AttValue에 대한 링크를 통해 내 대답에 인용 2. 속성 값 .
kjhughes

25

일반적으로 알려진 다섯 문자 [<,>, &, "및 '] 외에도 세로 탭 문자 (0x0B)를 이스케이프 처리합니다. 유효한 UTF-8이지만 유효한 XML 1.0 및 많은 라이브러리 (고 이식성 (ANSI C) 라이브러리 libxml2 포함 )이 누락되어 자동으로 잘못된 XML을 출력합니다.


11

요약 : XML, 이스케이프

사전 정의 된 5 개의 엔티티가 있습니다.

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

"허용 된 모든 유니 코드 문자는 숫자 참조로 표시 될 수 있습니다." 예를 들면 다음과 같습니다.

&#20013;

대부분의 제어 문자와 다른 유니 코드 범위는 특별히 제외됩니다. 즉, 이스케이프되거나 직접 발생 할 수 없습니다.

XML의 유효한 문자


3

상황에 따라 다릅니다. 내용의 경우 <&]]>입니다 (단 하나의 문자 대신 3 개의 문자열 임).

속성 값의 경우 < , & , "' 입니다.

CDATA의 경우 ]]> 입니다.


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