모든 아티클

XML Entities: XML 문서에서 문자 이스케이프하기

HTML과 마찬가지로 XML도 태그를 표시하기 위해 꺾쇠괄호와 앰퍼샌드를 사용한다. 그래서 이 기호들은 텍스트 내용 안에 그대로 들어갈 수 없다 — 문서가 유효한 XML이 아니게 되며, 깨진 HTML도 어떻게든 표시하려는 브라우저와 달리 XML 파서는 오류를 내고 처리를 멈춘다.

필수 엔티티 다섯 가지

수백 개의 명명된 엔티티를 정의하는 HTML과 달리, XML 명세가 요구하는 엔티티는 단 다섯 개뿐이다.

  • &lt;< 대신
  • &gt;> 대신
  • &amp;& 대신
  • &apos; — 작은따옴표 ' 대신
  • &quot; — 큰따옴표 " 대신

따옴표는 속성(attribute) 값 안에서만 이스케이프하면 되지만, <&는 텍스트 내용 어디에서나 이스케이프해야 한다.

실제로 어디서 쓰이는가

한국의 전자세금계산서는 XML 기반 표준 형식으로 국세청에 전송되는데, 회사명에 &가 들어 있으면(예: "김앤박 상사") 이스케이프하지 않을 경우 문서 전체가 무효 처리된다. 같은 문제가 뉴스 사이트의 RSS 피드에서도 나타난다 — 기사 제목에 이스케이프되지 않은 & 하나만 있어도 구독자의 피드 리더에서 전체 피드를 읽지 못하게 된다.

XML이 HTML보다 엄격한 이유

브라우저는 대개 잘못된 HTML도 너그럽게 봐주고 오류가 있어도 페이지를 표시하려 한다. XML 파서는 그렇지 않다 — 이스케이프되지 않은 앰퍼샌드나 꺾쇠괄호 하나만 있어도 문서 전체가 무효가 되고, 처리는 오류와 함께 즉시 중단된다.

언제 필요한가

  • 사용자 입력 텍스트를 XML 문서(피드, 설정 파일, SOAP 메시지)에 넣기 전에 준비할 때.
  • 디버깅: 받은 XML에서 엔티티 뒤에 숨겨진 원래 텍스트를 확인할 때.
  • 문서 구조를 깨뜨리지 않고 XML 파일을 직접 편집할 때.

엔티티의 대안: CDATA 섹션

텍스트 블록에 특수 문자가 많이 들어 있을 때 — XML 안에 삽입된 HTML이나 코드 조각처럼 — <![CDATA[...]]>로 감싸는 편이 더 편리하다. 이 섹션 안에서는 <&를 이스케이프할 필요 없이 그냥 텍스트로 취급된다. 유일한 예외는 CDATA를 닫는 ]]> 시퀀스로, 이는 섹션 내용 자체에는 나타날 수 없다.

도구 사용해보기