145

私は過去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ストリームに存在するチャンク情報がある場合とない場合

そして、私はこれらのほとんどを複数の組み合わせで試しましたが、それらが相互作用することが理にかなっています-何もありません!私は私の機知に富んでいます。誰かがこのような問題を見たことがありますか?それがうまくいけばそれに光を当てることができますか?

ありがとう!

4

14 に答える 14

158

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]+)<","<");
于 2010-06-13T03:02:04.773 に答える
11

トップのutf-8 xmlタグが<?xml version="1.0" encoding="utf-8"?>

Encoding(Tab) > Encode in UTF-8:selected を使用して notpad++ にファイルを保存することで修正されました (以前は UTF-8-BOM でエンコードされていました)。

于 2018-07-27T06:24:05.103 に答える
7
于 2013-05-07T12:19:53.257 に答える
6

私は同じ問題に直面していました。私の場合、XML ファイルは c# プログラムから生成され、さらに処理するために AS400 にフィードされました。いくつかの分析の結果、XML ファイルの生成中に UTF8 エンコーディングを使用していたことが判明しましたが、javac (AS400 では) は「BOM なしの UTF8」を使用しています。そのため、以下に示すような追加のコードを記述する必要がありました。

//create encoding with no BOM
Encoding outputEnc = new UTF8Encoding(false); 
//open file with encoding
TextWriter file = new StreamWriter(filePath, false, outputEnc);           

file.Write(doc.InnerXml);
file.Flush();
file.Close(); // save and close it
于 2014-05-23T13:59:11.233 に答える
1

私のxmlファイルで「コンテンツはプロローグでは許可されていません」という同じ問題に直面していました。

解決

最初のルート フォルダは「#ファイル名」でした。

最初の文字「#」を削除すると、エラーが解決しました。

#filename を削除する必要はありません...この方法で試してください..

ファイルまたは URL オブジェクトをアンマーシャラー メソッドに渡す代わりに、FileInputStream を使用します。

File myFile = new File("........");
Object obj = unmarshaller.unmarshal(new FileInputStream(myFile));
于 2015-01-23T11:02:36.387 に答える
0

以下は、上記の「org.xml.sax.SAXParseException: Content is not allowed in prolog」例外の原因です。

  1. まず、schema.xsd と file.xml のファイル パスを確認します。
  2. XML と XSD (または DTD) のエンコーディングは同じである必要があります。
    XML ファイル ヘッダー: <?xml version='1.0' encoding='utf-8'?>
    XSD ファイル ヘッダー:<?xml version='1.0' encoding='utf-8'?>
  3. XML 文書型宣言の前に何かがある場合:hello<?xml version='1.0' encoding='utf-16'?>
于 2016-12-12T09:36:17.380 に答える
0

問題の私の例では、解決策はドイツ語のウムラウト (äöü) を HTML に相当するものに置き換えることでした...

于 2015-02-21T14:31:43.260 に答える