나는 지난 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이 아닌 인코딩 된 문자 등에 대해 이중, 삼중, 사중으로 확인했습니다. 바이트 순서 표시 또는 그 성격의 배열에서 바이트 단위로 살펴 보았습니다. 아무것도; 내가 던질 수있는 모든 검증 테스트를 통과합니다. 더 이상하게도 Saxon 기반 파서를 사용하면 발생하지만 GAE에서만 항상 로컬 환경에서 잘 작동합니다.
완벽하게 작동하는 환경에서만 디버거를 실행할 수있을 때 문제에 대한 코드를 추적하기가 매우 어렵습니다 (GAE에서 원격으로 디버깅하는 좋은 방법을 찾지 못했습니다). 그럼에도 불구하고 기본 수단을 사용하여 다음을 포함하여 백만 가지 접근 방식을 시도했습니다.
- 프롤로그가 있거나없는 XML
- 줄 바꿈 포함 및 제외
- 프롤로그에 "encoding ="속성이 있거나없는 경우
- 두 개행 스타일
- HTTP 스트림에 청킹 정보가있는 경우와없는 경우
그리고 나는 그것들이 상호 작용하는 것이 합리적 인 여러 조합으로 이들 대부분을 시도했습니다. 나는 내 지혜의 끝에있다. 누구든지 이전에 이와 같은 문제를 본 적이 있습니까?
감사!