programing

org.xml.sax.SAXParse Exception:내용은 프롤로그에서 허용되지 않습니다.

nicescript 2022. 8. 9. 22:04
반응형

org.xml.sax.SAXParse Exception:내용은 프롤로그에서 허용되지 않습니다.

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이 있는 경우에도 같은 현상이 발생할 수 있습니다.

사실 유리 주바레프의 포스트에 덧붙여

존재하지 않는 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 파일이 완전히 올바르고 실제 문제를 파악하기 위해 이틀을 소비해야 했습니다.

이 사이에 를 해 보세요.encoding="UTF-8" " " " " 。?>XML 에서는, 이 괄호 물음표로 구분된 요소가 문서의 선두에 표시됩니다(스택 오버 플로우의 태그 프롤로그는 프로그래밍 언어를 참조합니다).

추가: 프롤로그 앞에 있는 대시도 문서의 일부입니까?프롤로그 앞에 데이터가 있는 것은 오류입니다.-<?xml version="1.0" encoding="UTF-8"?>.

프리마커로 XML 문서를 해석하려고 할 때도 같은 문제가 발생했습니다(해결했습니다).

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

이 문제는 파일 부호화와 XML 부호화 속성이 다른 경우에만 발생합니다.(예: 헤더에 UTF-16 Atribut이 있는 UTF-8 파일).

그래서 저는 두 가지 방법으로 문제를 풀 수 있었습니다.

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

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

WSDL에서 비슷한 문제를 추적하는 데 4시간밖에 걸리지 않았습니다.WSDL은 다른 네임스페이스 XSD를 Import하는 XSD를 사용했습니다.이 Import된 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부터 실망스러운 오류 보고까지.

제 답변은 아마 당신에게 도움이 되지 않을 것입니다만, 일반적으로는 이 문제에 도움이 됩니다.

이러한 예외가 발견되면 xml 파일을 Hex Editor에서 열어야 합니다.또한 파일 선두에 텍스트에디터가 표시되지 않는 추가 바이트가 표시될 수도 있습니다.

삭제하면 xml이 구문 분석됩니다.

저 같은 경우에는 'block='를 제거합니다.UTF-8' Atribut은 모두 동작했습니다.

파일이 UTF-8이 아니기 때문에 문자 집합 인코딩 문제인 것 같습니다.

XML이 아닌 코드일 수 있습니다.

다음 코드,

Document doc = dBuilder.parse(new InputSource(new StringReader("file.xml")));

이 에러도 발생합니다.

[치명적 오류] : 1:1: prolog.org.xml.sax에서 콘텐츠를 사용할 수 없습니다.SAXParseException, lineNumber: 1, columnNumber: 1, 콘텐츠는 프롤로그에서 허용되지 않습니다.

리터럴의 하고 있기 「」는 「」를 해 주세요."file.xml".file.xml과 file)이 원인이 되어 한다."file.xml"XML이 아니기 입니다.

삭제: 삭제: 삭제StringReader():

Document doc = dBuilder.parse(new InputSource("file.xml"));

마찬가지로 더티 버퍼 문제도 실제 XML 앞에 남아 있는 정크를 남길 수 있습니다.XML을 주의 깊게 확인했는데도 이 오류가 발생하는 경우 파서에 전달되는 정확한 내용을 기록하십시오. 실제로 구문 분석된 내용이 놀랍습니다.

먼저 프로젝트를 정리한 다음 프로젝트를 재구축합니다.나도 같은 문제에 직면해 있었다.이 일이 있은 후 모든 것이 잘 되었다.

Unix/Linux 시스템에서 BOM 문제를 해결하려면:

  1. 문자가합니다.「 BOM 」 。hexdump -C myfile.xml | more는, 에 「BOM」이라고 됩니다....<?xml>

  2. ㄴ, ㄴ다를 .file myfile.xml 과 같이 myfile.xml: XML 1.0 document text, UTF-8 Unicode (with BOM) text

  3. 과 같은 단일 합니다.tail -c +4 myfile.xml > temp.xml && mv temp.xml myfile.xml

  4. 되었는지 확인합니다. 이 또한 현명하게 행동할 수 것이다.view myfile.xml내용물이 남아 있는지 확인합니다.

XML 파일의 전체 폴더를 삭제하는 bash 스크립트는 다음과 같습니다.

#!/usr/bin/env bash

# This script is to sanitise XML files to remove any BOM characters

has_bom() { head -c3 "$1" | LC_ALL=C grep -qe '\xef\xbb\xbf'; }

for filename in *.xml ; do
  if has_bom ${filename}; then
    tail -c +4 ${filename} > temp.xml
    mv temp.xml ${filename}
  fi
done

내가 해 본 것은 [실패]

에는 ★★★★★★★★★★★★★★★★★★★★★★★★★.web.xml내 지원서에 여분의 공간이 있었다.삭제 후에도 작동하지 않았다!

는 지가 with with를 가지고 놀고 .logging.properties ★★★★★★★★★★★★★★★★★」web.xml내 Tomcat에 있지만, 내가 되돌린 후에도 오류가 지속됩니다!

솔루션

구체적으로 말하면, 나는 덧셈을 시도했다.

org.apache.catalina.filters.ExpiresFilter.level = FINE

Tomcat 만료 필터가 올바르게 작동하지 않습니다.

여분의 공간

그 외의 모든 것이 실패했을 경우는, 파일을 바이너리 형식으로 열어, 파일의 선두에 재미있는 문자(파일을 utf-8 로 식별하는 인쇄 불가능한 문자 3 문자)가 없는 것을 확인합니다.이렇게 해서 몇 개 찾았어요.그래서 파일을 utf-8에서 asciii로 변환했고 작동했어요.

같은 문제로 다음 행을 삭제했습니다.

  File file = new File("c:\\file.xml");
  InputStream inputStream= new FileInputStream(file);
  Reader reader = new InputStreamReader(inputStream,"UTF-8");
  InputSource is = new InputSource(reader);
  is.setEncoding("UTF-8");

잘 되고 있어요.UTF-8이 왜 문제를 일으키는지 잘 모르겠다.충격에 빠지지 않기 위해 UTF-8에도 문제가 없습니다.

Java*jdk1.6.0_13*에서 Windows-7 32비트 및 Netbeans IDE를 사용하고 있습니다.그게 어떻게 돌아가는지 모르겠어.

Mike Sokolov가 이미 지적한 것처럼 태그 앞에 일부 문자(예: 공백)가 있는 것이 원인 중 하나입니다.

입력 XML이 (바이트 배열이 아닌) 문자열로 읽히는 경우 입력 문자열을 아래 코드로 대체하여 XML 태그가 지워지기 전에 모든 "불필요한" 문자를 지울 수 있습니다.

inputXML=inputXML.substring(inputXML.indexOf("<?xml"));

단, 입력 xml이 xml 태그로 시작하는지 확인해야 합니다.

여기에 나와 있는 지시사항을 따르면 동일한 오류가 발생하였습니다.

메모장이나 XML 메모장에서 몇 가지 해결(부호화 변경, 복사 붙여넣기 대신 XML 파일 입력 등)을 시도했지만 아무 일도 일어나지 않았습니다.

XML 파일을 편집하여 메모장++에 저장하면 문제가 해결되었습니다(BOM을 사용하지 않고 인코딩 --> utf-8).

이 에러는 제가 사용한 API가 XML 또는 JSON 형식으로 데이터를 반환할 수 있기 때문에 발생합니다.브라우저를 사용하여 테스트했을 때는 디폴트로 XML 포맷으로 되어 있었습니다만, Java 애플리케이션으로부터 같은 콜을 호출하면, API가 JSON 포맷의 응답을 반환해, 자연스럽게 해석 에러가 트리거 됩니다.

다음 오류가 발생한 모든 사용자: 경고: Catalina.start using conf/server.xml: 내용은 프롤로그에서 허용되지 않습니다.

별로 도움이 안 돼요그러나 실제로는 conf/server.xml 파일에 가비지가 있다는 것을 의미합니다.

다른 XML 파일에서도 이 에러가 발생하고 있습니다.이 에러는 가비지를 도입한 텍스트에디터에서 변경을 가함으로써 발생할 수 있습니다.

파일에 가비지가 있는지 여부를 확인할 수 있는 방법은 "HEX Editor"로 여는 것입니다. 이 문자열 앞에 문자가 있는 경우

     "<?xml version="1.0" encoding="UTF-8"?>"

이렇게 하면 쓰레기가 되는 것처럼

     "‰ŠŒ<?xml version="1.0" encoding="UTF-8"?>"

그게 네 문제야...해결책은 정상적인 HEX Editor를 사용하는 것입니다.다른 유형의 인코딩으로 파일을 저장할 수 있습니다.

그런 다음 UTF-8로 저장합니다. XML 파일을 사용하는 일부 시스템에서는 "NO Byte Order Mark"를 사용하여 UTF NO BOM으로 저장해야 할 수 있습니다.

이게 도움이 됐으면 좋겠어!!

빌드 -> 클린으로 모든 것을 해결했습니다!

XML 파일도 같은 문제가 있어서 ANSI 인코딩(Windows-1252)으로 파일을 읽고, Python에서 작은 스크립트를 사용하여 UTF-8 인코딩으로 파일을 쓰는 문제를 해결했습니다.메모장++를 사용하려고 했지만 성공하지 못했습니다.

import os
import sys

path = os.path.dirname(__file__)

file_name = 'my_input_file.xml'

if __name__ == "__main__":
    with open(os.path.join(path, './' + file_name), 'r', encoding='cp1252') as f1:
        lines = f1.read()
        f2 = open(os.path.join(path, './' + 'my_output_file.xml'), 'w', encoding='utf-8')
        f2.write(lines)
        f2.close()

미래에 대해 한 가지 더 생각해 봅시다.이 버그가 발생하는 것은 XML 창이 활성화 표시로 되어 있고 주의를 기울이지 않을 때 단순히 삭제 키 또는 다른 키를 랜덤으로 누를 수 있는 경우일 수 있습니다.이전에도 웹 어플리케이션의 struts.xml 파일에서 이런 일이 있었습니다.어설픈 팔꿈치...

나도 똑같은 걸 받고 있었어

XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,2] Message: Reference is not allowed in prolog.

응용 프로그램이 RestFull Webservice 호출에 대한 XML 응답을 만들고 있을 때.XML 형식의 String을 작성하는 동안 &lt와 &gt를 <와 >로 대체하고 오류가 발생하며 적절한 응답을 받았습니다.어떻게 작동했는지는 모르겠지만 작동했다.

샘플:

String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>"
            +sum
            +"</ns:return></ns:addNumbersResponse>";

저도 같은 문제가 있었어요.

파일을 .Content is not allowed in prolog★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★시각적인 파일도 보기 좋았는데 왠지 망가졌어요.

그래서 같은 파일을 다시 다운받아서 같은 파일을 시도해보니 작동했어요.

최근에도 같은 문제가 있었습니다만, URL이 잘못되어 표준 403 HTTP 응답(클라이언트가 찾고 있던 유효한 XML이 아닌 것은 분명합니다)이 원인이었습니다.같은 맥락의 누군가가 이 문제에 직면했을 경우에 대비하여 자세한 내용을 공유하겠습니다.

이것은 Spring 기반의 웹 어플리케이션으로, 리모트포트의 프록시를 공개하도록 「JaxWsPortProxyFactoryBean」빈을 설정했습니다.

<bean id="ourPortJaxProxyService"
    class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"
    p:serviceInterface="com.amir.OurServiceSoapPortWs"
    p:wsdlDocumentUrl="${END_POINT_BASE_URL}/OurService?wsdl"
    p:namespaceUri="http://amir.com/jaxws" p:serviceName="OurService"
    p:portName="OurSoapPort" />

"END_POINT_BASE_URL"은 웹 애플리케이션을 호스트하는 Tomcat 인스턴스의 "setenv.sh"에서 설정된 환경 변수입니다.파일의 내용은 다음과 같습니다.

export END_POINT_BASE_URL="http://localhost:9001/BusinessAppServices"
#export END_POINT_BASE_URL="http://localhost:8765/BusinessAppServices"

각 행 뒤에 ";"가 없기 때문에 URL이 잘못되어 응답이 부정하게 되었습니다.즉, "BusinessAppServices/OurService?wsdl" 대신 URL에 "/" 앞에 CR이 표시되었습니다. "TCP/IP Monitor"는 문제를 해결하는 데 매우 편리했습니다.

나조차도 비슷한 문제에 직면했었다.파일 선두에 가비지 문자가 있는 것이 원인입니다.

수정 : 텍스트에디터(Sublime text에서 테스트)에서 파일을 열면 파일에 들여쓰기가 있으면 삭제하고 파일의 모든 내용을 새 파일에 복사하여 저장합니다.바로 그거야!새 파일을 실행했을 때 구문 분석 오류 없이 실행되었습니다.

Dineshkumar의 코드를 가져와서 XML 파일의 유효성을 올바르게 확인하도록 수정했습니다.

import org.apache.log4j.Logger;

public class Myclass{

private static final Logger LOGGER = Logger.getLogger(Myclass.class);

/**
 * Validate XML file against Schemas XSD in pathEsquema directory
 * @param pathEsquema directory that contains XSD Schemas to validate
 * @param pathFileXML XML file to validate
 * @throws BusinessException if it throws any Exception
 */
public static void validarXML(String pathEsquema, String pathFileXML) 
	throws BusinessException{	
	String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
	String nameFileXSD = "file.xsd";
	String MY_SCHEMA1 = pathEsquema+nameFileXSD);
	ParserErrorHandler parserErrorHandler;
	try{
		SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA);
		
		Source [] source = { 
			new StreamSource(new File(MY_SCHEMA1))
			};
		Schema schemaGrammar = schemaFactory.newSchema(source);

		Validator schemaValidator = schemaGrammar.newValidator();
		schemaValidator.setErrorHandler(
			parserErrorHandler= new ParserErrorHandler());
		
		/** validate xml instance against the grammar. */
		File file = new File(pathFileXML);
		InputStream isS= new FileInputStream(file);
		Reader reader = new InputStreamReader(isS,"UTF-8");
		schemaValidator.validate(new StreamSource(reader));
		
		if(parserErrorHandler.getErrorHandler().isEmpty()&& 
			parserErrorHandler.getFatalErrorHandler().isEmpty()){
			if(!parserErrorHandler.getWarningHandler().isEmpty()){
				LOGGER.info(
				String.format("WARNING validate XML:[%s] Descripcion:[%s]",
					pathFileXML,parserErrorHandler.getWarningHandler()));
			}else{
				LOGGER.info(
				String.format("OK validate  XML:[%s]",
					pathFileXML));
			}
		}else{
			throw new BusinessException(
				String.format("Error validate  XML:[%s], FatalError:[%s], Error:[%s]",
				pathFileXML,
				parserErrorHandler.getFatalErrorHandler(),
				parserErrorHandler.getErrorHandler()));
		}		
	}
	catch(SAXParseException e){
		throw new BusinessException(String.format("Error validate XML:[%s], SAXParseException:[%s]",
			pathFileXML,e.getMessage()),e);
	}
	catch (SAXException e){
		throw new BusinessException(String.format("Error validate XML:[%s], SAXException:[%s]",
			pathFileXML,e.getMessage()),e);
	}
	catch (IOException e) {
		throw new BusinessException(String.format("Error validate XML:[%s], 
			IOException:[%s]",pathFileXML,e.getMessage()),e);
	}
	
}

}

다음과 같이 문서를 설정합니다.

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    %children%
</root>

나도 봄과 같은 문제가 있었다.

Marshalling Message Converter

프리프로세스 코드에 의한 것입니다.

메이비에게는 이유가 필요합니다.바이트 메시지 #readBytes - 바이트를 읽습니다.독서가 한 방향 조작이라는 걸 깜빡했네요두 번 읽으면 안 돼요.

apache.commons에서 BOMInputStream을 사용해 보십시오.IO:

public static <T> T getContent(Class<T> instance, SchemaType schemaType, InputStream stream) throws JAXBException, SAXException, IOException {

    JAXBContext context = JAXBContext.newInstance(instance);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    Reader reader = new InputStreamReader(new BOMInputStream(stream), "UTF-8");

    JAXBElement<T> entry = unmarshaller.unmarshal(new StreamSource(reader), instance);

    return entry.getValue();
}

해석하는 동안 같은 문제가 발생했습니다.info.plist내 Mac에 파일을 저장하세요.단, 다음 명령어를 사용하여 문제가 해결되었습니다.이 명령어는 파일을 XML로 변환합니다.

plutil -convert xml1 info.plist

그게 도움이 됐으면 좋겠어요.

언급URL : https://stackoverflow.com/questions/5138696/org-xml-sax-saxparseexception-content-is-not-allowed-in-prolog

반응형