私は過去48時間、この絶対に腹立たしいバグに頭を悩ませてきたので、ラップトップを窓から投げ出す前に、ついにタオルを投げてここで尋ねてみようと思いました。
AWSSimpleDBに対して行った呼び出しからの応答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ストリームに存在するチャンク情報がある場合とない場合
そして、私はこれらのほとんどを複数の組み合わせで試しましたが、それらが相互作用することが理にかなっています-何もありません!私は私の機知に富んでいます。誰かがこのような問題を見たことがありますか?それがうまくいけばそれに光を当てることができますか?
ありがとう!