Tôi đã đập đầu với lỗi hoàn toàn tức giận này trong 48 giờ qua, vì vậy tôi nghĩ cuối cùng tôi sẽ ném chiếc khăn vào và thử hỏi ở đây trước khi ném máy tính xách tay của mình ra ngoài cửa sổ.
Tôi đang cố gắng phân tích cú pháp XML phản hồi từ cuộc gọi tôi đã thực hiện tới AWS SimpleDB. Phản hồi đang trở lại trên dây tốt; ví dụ, nó có thể giống như sau:
<?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>
Tôi chuyển XML này cho một trình phân tích cú pháp với
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
và gọi eventReader.nextEvent();
nhiều lần để lấy dữ liệu tôi muốn.
Đây là phần kỳ lạ - nó hoạt động tốt bên trong máy chủ cục bộ. Phản hồi đến, tôi phân tích cú pháp, mọi người rất vui. Vấn đề là khi tôi triển khai mã cho Google App Engine, yêu cầu gửi đi vẫn hoạt động và XML phản hồi có vẻ giống hệt và chính xác 100% đối với tôi, nhưng phản hồi không thể phân tích cú pháp với ngoại lệ sau:
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)
Tôi đã kiểm tra gấp đôi, gấp ba, gấp bốn lần XML này để tìm 'ký tự ẩn' hoặc ký tự được mã hóa không phải UTF8, v.v. Tôi đã xem xét nó từng byte trong một mảng để tìm dấu thứ tự byte hoặc thứ gì đó có tính chất như vậy. Không có gì; nó vượt qua mọi bài kiểm tra xác nhận mà tôi có thể ném vào nó. Lạ lùng hơn nữa, nó cũng xảy ra nếu tôi sử dụng trình phân tích cú pháp dựa trên Saxon - nhưng CHỈ trên GAE, nó luôn hoạt động tốt trong môi trường cục bộ của tôi.
Rất khó để theo dõi mã cho các sự cố khi tôi chỉ có thể chạy trình gỡ lỗi trên một môi trường hoạt động hoàn hảo (tôi chưa tìm thấy bất kỳ cách tốt nào để gỡ lỗi từ xa trên GAE). Tuy nhiên, bằng cách sử dụng các phương tiện ban đầu mà tôi có, tôi đã thử một triệu cách tiếp cận bao gồm:
- XML có và không có phần mở đầu
- Có và không có dòng mới
- Có và không có thuộc tính "encoding =" trong phần mở đầu
- Cả hai kiểu dòng mới
- Có và không có thông tin phân khúc có trong luồng HTTP
Và tôi đã thử hầu hết những thứ này theo nhiều cách kết hợp mà chúng sẽ tương tác với nhau - không có gì! Tôi đã tới giới hạn của mình rồi. Có ai đã thấy một vấn đề như thế này trước đó có thể hy vọng làm sáng tỏ về nó không?
Cảm ơn!