[java] org.xml.sax.SAXParseException : 프롤로그에서 컨텐츠를 사용할 수 없습니다

Java 기반 웹 서비스 클라이언트가 Java 웹 서비스에 연결되어 있습니다 (Axis1 프레임 워크에서 구현 됨).

로그 파일에 다음과 같은 예외가 발생합니다.

Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
    at org.apache.ws.axis.security.WSDoAllReceiver.invoke(WSDoAllReceiver.java:114)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:198)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)



답변

이것은 종종 XML 선언 전에 공백으로 인해 발생하지만 대시 나 문자와 같은 텍스트 일 수 있습니다 . 사람들이 공백을 항상 무시할 수 있다고 가정하기 때문에 공백으로 인해 종종 발생한다고 말합니다.하지만 여기서는 그렇지 않습니다.


자주 발생하는 또 다른 한가지는 것입니다 UTF-8 BOM (바이트 순서 표시) 되는 XML 선언이 공백으로 처리하기 전에 문서를 XML 파서에 문자의 스트림로서가 아닌 바이트 스트림으로 넘겨 경우 허용 .

스키마 파일 (.xsd)을 사용하여 xml 파일의 유효성을 검사하고 스키마 파일 중 하나에 UTF-8 BOM 이있는 경우에도 마찬가지 입니다.


답변

Yuriy Zubarev의 게시물 외에도 실제로

존재하지 않는 xml 파일을 파서에 전달할 때 예를 들어 당신은 통과

new File("C:/temp/abc")

파일 시스템에 C : /temp/abc.xml 파일 만 존재하는 경우

두 경우 모두

builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
document = builder.parse(new File("C:/temp/abc"));

또는

DOMParser parser = new DOMParser();
parser.parse("file:C:/temp/abc");

모두 같은 오류 메시지가 나타납니다.

다음 추적 때문에 매우 실망스러운 버그

javax.servlet.ServletException
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
...
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
... 40 more

‘파일 이름이 잘못되었습니다’또는 ‘이러한 파일이 존재하지 않습니다’라는 사실에 대해서는 아무 말도하지 않습니다. 제 경우에는 xml 파일을 완전히 수정했으며 실제 문제를 확인하는 데 2 ​​일이 걸렸습니다.


답변

encoding="UTF-8"프롤로그 의 문자열과 종료 사이에 공백을 추가하십시오 ?>. XML에서 프롤로그는 문서 시작시이 괄호로 묶인 물음표로 구분 된 요소를 지정합니다 (스택 오버플로의 태그 프롤로그는 프로그래밍 언어를 참조 함).

추가 : 문서의 프롤로그 부분 앞에 대시가 있습니까? 프롤로그 앞에 데이터가 있으면 오류가 발생 -<?xml version="1.0" encoding="UTF-8"?>합니다.


답변

freemarker로 XML 문서를 구문 분석하는 동안 동일한 문제가 발생했습니다.

XML 파일 헤더 앞에 공백이 없었습니다.

파일 인코딩과 XML 인코딩 속성이 다른 경우에만 문제가 발생합니다 . (예 : 헤더에 UTF-16 속성이있는 UTF-8 파일).

그래서 두 가지 방법으로 문제를 해결했습니다.

  1. 파일 자체의 인코딩 변경
  2. 헤더 UTF-16을 UTF-8로 변경

답변

XML이 잘못되었거나 응답 본문이 XML 문서가 아님을 의미합니다.


답변

WSDL에서 비슷한 문제를 추적하기 위해 4 시간을 보냈습니다. 다른 네임 스페이스 XSD를 가져 오는 XSD를 사용하는 WSDL이 밝혀졌습니다. 가져온 XSD에는 다음이 포함되어 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.xyz.com/Services/CommonTypes" elementFormDefault="qualified"
    xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:CommonTypes="http://www.xyz.com/Services/CommonTypes">

 <include schemaLocation=""></include>
    <complexType name="RequestType">
        <....

include요소에 주목하십시오 ! 이것이 내 재앙의 뿌리였습니다. 나는 이것이 위의 Egor 파일에서 찾을 수없는 문제의 변형이라고 생각합니다.

실망스러운 오류보고 +1


답변

필자의 경우 ‘encoding = “UTF-8″‘특성을 모두 제거했습니다.

파일이 실제로 UTF-8이 아니기 때문에 문자 세트 인코딩 문제처럼 보입니다.