까막군's 주접 블로그

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

[Java] Content is not allowed in prolog. Error 발생시 원인과 해결책

2008/06/05 15:36, 글쓴이 까막군

작성일 : 2008년 06년 05일
작성자 : 최용수(http://ariswear.com)

Category : Java, Webservice, Soap

<Issue>

Java에서 Soap을 이용해서 Webservice를 호출할때 다음과 같은 에러가 발생한다.

org.xml.sax.SAXParseException: Content is not allowed in prolog.


<reason>

두가지 경우가 있는데

첫번째, XML파일에 Prolog 즉 선언부에 선언문이 적혀있지 않고 바로 본문 내용이 쓰였을 경우다.

두번째, BOM (Byte Order Mark) 관련 문제다.

유니코드가, little-endian 인지 big-endian 인지 아니면 UTF-8 인지 쉽게 알 수 있도록,
유니코드 파일이 시작되는 첫부분에 보이지 않게, 2~3바이트의 문자열을 추가하는데 이것을 BOM이라고 한다.
텍스트 에디터 화면에서는 보이지 않고, 헥사 에디터(Hex Editor)로 열었을 때만 보입니다.

인터넷에 올릴 HTML/CSS/XML 파일을 UTF-8로 작성할 때에는 BOM이 있으면 문제가 생길 수 있습니다.

little-endian 의 BOM:
FF FE

big-endian 의 BOM:
FE FF

UTF-8 의 BOM:
EF BB BF

* 울트라에디트의 헥사 모드(Ctrl+H)로 UTF-8 파일을 보면, 16비트 유니코드처럼 보이고 BOM이 있든 없든 항상 FF FE 라는 엉뚱한 BOM이 나타납니다. 이것은 울트라에디터가 유니코드를 편집할 때, 내부적으로 '16비트 little-endian 유니코드 (UTF-16LE)'로 변환하여 편집하기 때문입니다. 진짜 헥사 에디터로 보아야만 UTF-8의 BOM인 EF BB BF 가 제대로 보이게 됩니다. 물론 BOM이 없는 UTF-8이라면 BOM이 없는 것으로 나옵니다.
출처 : Tong - ryu0423님의 MFC 일반통

<solution>

첫번째 원인일 경우, 즉 선언부가 존재하지 않을경우
선언부를 XML에 넣어주면 된다. 간단히 다음 문장을 xml 상단에 표기한다.

<?xml version="1.0"?>

두번째 원인일 경우, Editor를 바꿔보는것을 추천한다.
(일일이 Hex 편집하는건 내가봐도 좀 아니다.)

다른 방법으로는 만약 Stream 같은 것으로 xml을 로드할 경우
문자열 시작 부분의 바이트를 무시하고 로드하는것을 시도해본다.

즉 XML을 로드해서 byte array로 변환후 0번째 인덱스 값을 잘라내고 Load해보는것을 시도해 보기 바란다.

BOM 관련해서 근본적으로 BOM을 제거해서 생성하는 방법도 알아보았다.

사용자 삽입 이미지

위의 이미지는 EditPlus에서 UTF-8 파일 관련해서 설정할 수 있는 화면이다. [..EditPlus는 요게 된다.]

  • Preserve existing signature: BOM이 있을 경우에만 그대로 유지합니다.
  • Always add signature: 항상 BOM을 넣습니다.
  • Always remove signature: BOM이 있으면 무조건 제거합니다.
  • Add signature if necessary: 필요할 경우에만 BOM을 넣습니다.
  • 여기에서 ‘Always remove signature’로 지정하면 편집하는 모든 파일의 BOM이 제거된다.


    크리에이티브 커먼즈 라이센스
    Creative Commons License
    2008/06/05 15:36 2008/06/05 15:36

    맨 위로