[解決済み】GAEで完全に有効なXMLをパースすると「Prologではコンテンツが許可されません」と表示される
質問
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でエンコードされていない文字などがないか、2重、3重、4重にチェックしました。バイト順マークやその類のものがないか、配列でバイトごとに見てみました。何もありません。私が投げかけたあらゆる検証テストに合格しています。さらに不思議なことに、Saxonベースのパーサーを使っても同じことが起こります。しかし、GAE上だけで、私のローカル環境ではいつもうまくいきます。
完全に動作する環境でしかデバッガを実行できない場合、コードをトレースして問題を見つけるのは非常に困難です(GAEでリモートデバッグする良い方法は見つかっていません)。それでも、私が持っている原始的な手段を使って、以下のようなアプローチを100万回ほど試してみました。
- プロローグ付きXMLとプロローグなし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]+)<","<");
関連
-
スクリプトとは何かを簡単に説明します。
-
linux シェル学習ノート 2日目
-
[解決済み] file(file, "rt") のエラー : complete.cases プログラム内の無効な 'description' 引数
-
[解決済み】「g++」が内部コマンド、外部コマンド、操作可能なプログラム、バッチファイルとして認識されない。
-
[解決済み】ValueError: shape mismatch: オブジェクトを1つの形状にブロードキャストできない
-
[解決済み】主成分分析:colMeans(x, na.rm = TRUE)のエラー:'x'は数値でなければなりません。
-
[解決済み】Jupyter Notebookが保存されない:postに'_xsrf'引数がない
-
[解決済み】C++で「Xは型名ではありません」エラー
-
[解決済み】rmarkdownエラー "長さ0の変数名を使おうとした"
-
[解決済み] org.xml.sax.SAXParseException: コンテンツはプロローグで許可されていません
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
batスクリプトからログを出力する方法
-
Swift言語とAppleScriptの違い、AppleScriptの開発状況について教えてください。
-
CE5.2版を使って、武術のベースサイトである第一レベルのメソッドを見つける(グラフィックチュートリアル)。
-
パスワード入力を非表示にする InstallShield スクリプト
-
[解決済み】 mean() 警告:引数が数値または論理でない:NAを返す
-
[解決済み】データフレームで関数を適用する場合、dim(X)は正の長さでなければならない
-
[解決済み] 'push_back' の呼び出しに対応するメンバ関数がないエラー
-
[解決済み】ウィンドウ階層にないビューを持つUIViewControllerでUIViewControllerを表示しようとする
-
[解決済み】二重の空きや破損(fasttop)
-
[解決済み] org.xml.sax.SAXParseException: コンテンツはプロローグで許可されていません