GAE에서 완벽하게 유효한 XML을 구문 분석할 때 "Prolog에서 컨텐츠가 허용되지 않습니다.
저는 지난 48시간 동안 이 완전히 화가 나는 벌레에 머리를 부딪쳐 왔습니다. 그래서 저는 노트북을 창밖으로 던지기 전에 마침내 수건을 집어 던지고 여기에 물어보려고 생각했습니다.
저는 AWS SimpleDB와 통화한 응답 XML을 파싱하려고 합니다.응답이 정상적으로 와이어로 되돌아옵니다. 예를 들어 다음과 같이 보일 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
<ListDomainsResult>
<DomainName>Audio</DomainName>
<DomainName>Course</DomainName>
<DomainName>DocumentContents</DomainName>
<DomainName>LectureSet</DomainName>
<DomainName>MetaData</DomainName>
<DomainName>Professors</DomainName>
<DomainName>Tag</DomainName>
</ListDomainsResult>
<ResponseMetadata>
<RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
<BoxUsage>0.0000071759</BoxUsage>
</ResponseMetadata>
</ListDomainsResponse>
나는 이 XML을 파서에게 전달합니다.
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
부름eventReader.nextEvent();
내가 원하는 데이터를 얻기 위해 여러 번.
여기 특이한 부분이 있습니다. 로컬 서버 내부에서 잘 작동합니다.응답이 들어오고, 내가 분석해보면, 모두가 기뻐합니다.문제는 내가 Google App Engine에 코드를 배포할 때 발신 요청이 여전히 작동하고 응답 XML이 100% 동일하고 정확한 것처럼 보이지만 다음 예외를 제외하고 응답 구문 분석에 실패한다는 것입니다.
com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (rest of lines omitted)
나는 이 XML에서 '보이지 않는 문자' 또는 UTF8 인코딩되지 않은 문자 등을 이중, 삼중, 4중으로 확인했습니다.저는 바이트 순서 표시 같은 것을 배열하여 바이트 단위로 보았습니다.아무것도 아닙니다. 제가 할 수 있는 모든 검증 테스트를 통과했습니다.더 이상한 것은 색슨 기반 파서를 사용하는 경우입니다. 하지만 GAE에서만 사용할 수 있습니다. 제 지역 환경에서는 항상 잘 작동합니다.
완벽하게 작동하는 환경에서만 디버거를 실행할 수 있는 경우(GAE에서 원격 디버그할 수 있는 좋은 방법을 찾지 못했습니다) 문제가 있는지 코드를 추적하는 것은 매우 어렵습니다.그럼에도 불구하고, 제가 가지고 있는 원시적인 수단을 사용하여, 저는 다음을 포함한 수많은 접근법을 시도했습니다.
- 프롤로그를 사용하거나 사용하지 않는 XML
- 새 선 포함 및 없음
- 프롤로그에 " encoding=" 특성이 있는 경우와 없는 경우
- 두 새 라인 스타일 모두
- HTTP 스트림에 존재하는 청킹 정보 유무
그리고 저는 이것들 대부분을 여러 조합으로 시도해 보았는데, 그 조합들이 상호작용하는 것이 합리적이었습니다. - 아무것도 아닙니다!어찌할 바를 모르겠어요.이와 같은 문제를 전에 본 적이 있는 사람이 있습니까?
감사합니다!
XML과 XSD(또는 DTD)의 인코딩은 다릅니다.
XML 파일 헤더:<?xml version='1.0' encoding='utf-8'?>
XSD 파일 헤더:<?xml version='1.0' encoding='utf-16'?>
XML 문서 유형 선언 앞에 무엇이 올 때 발생할 수 있는 또 다른 시나리오입니다.버퍼에 이와 같은 것이 있을 수 있습니다.
helloworld<?xml version="1.0" encoding="utf-8"?>
혹은 공간이나 특별한 캐릭터까지도.
버퍼에 있을 수 있는 바이트 순서 마커라고 하는 특수 문자가 있습니다.버퍼를 파서에게 전달하기 전에...
String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");
notepad++에서 xml 파일을 검사하고 파일을 저장하는 동안 문제가 있었습니다. 상위 utf-8 xml 태그가 다음과 같습니다.<?xml version="1.0" encoding="utf-8"?>
Encoding(탭) > Encoding in UTF-8:selected(UTF-8-BOM에서 Encoding)으로 notpad++에 파일을 저장하여 수정하였습니다.
이 오류 메시지는 항상 시작 요소의 잘못된 XML 내용으로 인해 발생합니다.예를 들어 XML 요소의 시작 부분에 "."라는 추가 작은 점이 있습니다.
"앞의 모든 문자<?xml….
” 위의 " org.xml.sax"를 야기합니다.SAXParse 예외: 프롤로그" 오류 메시지에 내용이 허용되지 않습니다.
앞에 작은 점 ".“<?xml….
고치기 위해서는 그 이상한 캐릭터들을 모두 삭제하고,“<?xml“
.
참조: http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/
저는 오늘도 같은 오류 메시지를 받았습니다.해결책은 문서를 BOM이 있는 UTF-8에서 BOM이 없는 UTF-8로 변경하는 것이었습니다.
저도 같은 문제에 직면해 있었습니다.저의 경우 XML 파일은 c# program에서 생성되어 AS400에 입력되어 추가적인 처리가 가능합니다.몇 가지 분석을 통해 XML 파일을 생성하는 동안 UTF8 인코딩을 사용하고 있는 반면 javac(AS400의 경우)은 "BOM"이 없는 UTF8". 따라서 아래에 언급된 것과 유사한 코드를 추가로 작성해야 했습니다.
//create encoding with no BOM
Encoding outputEnc = new UTF8Encoding(false);
//open file with encoding
TextWriter file = new StreamWriter(filePath, false, outputEnc);
file.Write(doc.InnerXml);
file.Flush();
file.Close(); // save and close it
제 xml 파일에서 헤더는 다음과 같이 보였습니다.
<?xml version="1.0" encoding="utf-16"? />
테스트 파일에서 파일 바이트를 읽고 데이터를 UTF-8(이 파일의 헤더가 utf-16임을 알 수 없음)로 디코딩하여 문자열을 만들고 있었습니다.
byte[] data = Files.readAllBytes(Paths.get(path));
String dataString = new String(data, "UTF-8");
이 문자열을 개체로 역직렬화하려고 했을 때 동일한 오류가 나타났습니다.
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
두번째 줄을 다음으로 업데이트했을 때
String dataString = new String(data, "UTF-16");
저는 그 물체를 수직에서 분리할 수 있었습니다.그래서 로메인이 위에서 언급했듯이 암호화는 일치해야 합니다.
xml 선언을 제거하면 해결되었습니다.
<?xml version='1.0' encoding='utf-8'?>
예기치 않은 이유:#
파일 경로의 문자
일부 내부 버그로 인해 파일 내용 자체는 100% 맞지만 다음과 같은 파일 이름을 제공하는 경우에도 Prolog에서 Content is not allowed in prolog라는 오류가 나타납니다.C:\Data\#22\file.xml
.
이는 다른 특수 문자에도 적용될 수 있습니다.
확인 방법:파일을 특수 문자가 없는 경로로 이동한 후 오류가 사라지면 이 문제가 발생한 것입니다.
xml 파일에서 "content is not allowed in prolog" 라는 문제에 직면했습니다.
해결책
처음에 내 루트 폴더는 '#Filename' 이었습니다.
첫 번째 문자 '#'을 제거했을 때 오류가 해결되었습니다.
#파일 이름을 제거할 필요가 없습니다...이런 식으로 시도해 보십시오.
파일 또는 URL 개체를 unmarshaller 메서드에 전달하는 대신 FileInputStream을 사용합니다.
File myFile = new File("........");
Object obj = unmarshaller.unmarshal(new FileInputStream(myFile));
"<?xml 이전에 이상한 문자를 모두 삭제하십시오"라는 정신으로 버퍼드 리더를 통한 입력과 잘 작동하는 자바 코드는 다음과 같습니다.
BufferedReader test = new BufferedReader(new InputStreamReader(fisTest));
test.mark(4);
while (true) {
int earlyChar = test.read();
System.out.println(earlyChar);
if (earlyChar == 60) {
test.reset();
break;
} else {
test.mark(4);
}
}
FWIW, 제가 보고 있던 바이트는 (십진수로) 239, 187, 191입니다.
공백 대신 탭 캐릭터가 있었습니다.탭 '\t'을(를) 교체하면 문제가 해결되었습니다.
전체 문서를 메모장++와 같은 편집기에 잘라 붙여넣고 모든 문자를 표시합니다.
문제의 경우, 해결책은 독일의 움라우트(äöü)를 HTML과 동등한 것으로 대체하는 것이었습니다.
아래는 " org.xml.sax" 이상의 원인입니다.SAXParse 예외:내용은 prolog" 예외에서 허용되지 않습니다.
- 먼저 schema.xsd와 file.xml의 파일 경로를 확인합니다.
- XML과 XSD(또는 DTD)의 인코딩은 동일해야 합니다.
XML 파일 헤더:<?xml version='1.0' encoding='utf-8'?>
XSD 파일 헤더:<?xml version='1.0' encoding='utf-8'?>
- XML 문서 유형 선언 앞에 오는 것이 있을 경우, 즉:
hello<?xml version='1.0' encoding='utf-16'?>
xml을 Mac OS에 압축하여 Windows 컴퓨터로 전송했는데 기본 압축으로 파일이 변경되어 인코딩에서 이 메시지가 전송되었습니다.
나에게 일어난 일은@JsmListener
IBM MQ를 들을 때 Spring Boot을 사용합니다. 제 메소드는 받았습니다.String
parameter를 JAXB를 사용하여 deserialization을 시도할 때 이 예외가 발생했습니다.
제가 받은 끈은 그 결과인 것 같았습니다.byte[].toString()
. 쉼표로 구분된 숫자들의 목록이었습니다.
파라미터 타입을 다음과 같이 변경하여 해결하였습니다.byte[]
그 다음에 그 다음에String
여기서:
@JmsListener(destination = "Q1")
public void receiveQ1Message(byte[] msgBytes) {
var msg = new String(msgBytes);
Soap에서 테스트 케이스를 실행할 때 이 메시지를 접했습니다.UI:
org.xml.sax.SAXParseException; systemId: file://; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
꽤 오랜 시간이 흐른 후에 나는 그 이유를 다음과 같은 선에서 알게 되었습니다.
def holder = groovyUtils.getXmlHolder("SoapCall#Request") // Get Request body
그리고 그 이유는 테스트 단계의 이름이 "SoapCall"이 아니라 "SOAPCall"이기 때문이었습니다.반환된 문자열이 비어 있어서 "프롤로그" 오류가 발생한 것 같습니다.
언급URL : https://stackoverflow.com/questions/3030903/content-is-not-allowed-in-prolog-when-parsing-perfectly-valid-xml-on-gae
'source' 카테고리의 다른 글
플라스크/Ajax HTTP 연결을 유지하는 방법? (0) | 2023.11.07 |
---|---|
각 12개의 'ng serve'는 거의 프로덕션 빌드와 같이 앱을 느리게 만듭니다. (0) | 2023.11.07 |
@미디어 최소 너비 & 최대 너비 (0) | 2023.11.07 |
오라클 디버깅 기법 (0) | 2023.11.07 |
Angular의 두 가지 사례가 필요합니다.JS $http 서비스? (0) | 2023.11.07 |