私は過去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とXSD(またはDTD)のエンコーディングは異なります。
XMLファイルヘッダー:<?xml version='1.0' encoding='utf-8'?>
XSDファイルヘッダー:<?xml version='1.0' encoding='utf-16'?>
これを引き起こすもう1つの考えられるシナリオは、XML文書型宣言の前に何かが来る場合です。つまり、バッファに次のようなものがあるかもしれません:
helloworld<?xml version="1.0" encoding="utf-8"?>
またはスペースや特殊文字。
バッファにある可能性のあるバイトオーダーマーカーと呼ばれるいくつかの特殊文字があります。バッファをパーサーに渡す前に、これを行ってください...
String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加