web-dev-qa-db-ja.com

org.xml.sax.SAXParseException:* VALID * XMLのファイルの早期終了

非常に奇妙な「ファイルの終了が早すぎます」サーバーのいずれかでの過去数日間の例外。 same構成XMLは、別のサーバーで正常に機能します。これら両方のサーバーでTomcat 5.0.28を使用しています。このコードは長年(7年以上)動作しており、最近のサーバークラッシュの後、サーバーの1つでこの問題に直面しました。 XMLおよびJava解析コードに変更はありません。 :(

私が見ることができる唯一の違いは、Javaバージョンにあります-

問題サーバー Javaバージョン "1.6.0_16" Java(TM)SEランタイム環境(ビルド1.6.0_16-b01)Java HotSpot(TM)64-ビットサーバーVM(ビルド14.2-b01、混合モード)

Working Server Java version "1.6.0_07" Java(TM)SE Runtime Environment(build 1.6.0_07-b06)Java HotSpot(TM)64-ビットサーバーVM(ビルド10.0-b23、混合モード)

数年前から機能しているJavaコードは次のとおりです-

private void readSource(final InputSource in ) {
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(in);
        Element elt = doc.getDocumentElement();

        this.readElement( elt );
    } catch ( Exception ex ) {
        ex.printStackTrace();
        throw new ConfigurationException( "Unable to parse configuration information", ex );
    }
}

そして、ここに例外があります。

[Fatal Error] :-1:-1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
        at org.Apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.Apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at com.circus.core.Configuration.readSource(Configuration.Java:706)

すでにXMLの検証を試みましたが、エラーは見つかりませんでした。考えられる問題を他にどこで探すことができますか?

どんなポインターでも大歓迎です!

TIA、-マニッシュ

44
Manish

これは解決されました。問題は他の場所にありました。 cronジョブの別のコードは、XMLを長さ0のファイルに切り捨てていました。私はその世話をしました。

21
Manish

Java InputStreamの問題です。ファイルオフセット位置カウンターがファイルの最後に移動すると、ストリームが読み取られます。同じストリームを使用した後続の読み取りでは、このエラーが発生します。そのため、ストリームを閉じて再度開くか、inputStream.reset()を呼び出してオフセットカウンターを初期位置にリセットする必要があります。

62
dadob051

この例外は、空の文字列/空のバイト配列を解析している場合にのみ発生します。

以下は、それを再現する方法のスニペットです。

String xml = ""; // <-- deliberately an empty string.
ByteArrayInputStream xmlStream = new Java.io.ByteArrayInputStream(xml.getBytes());
Unmarshaller u = JAXBContext.newInstance(...)
u.setSchema(...);
u.unmarshal( xmlStream ); // <-- here it will fail
16
Zo72

解析する前にinputstreamを消費していないことを確認してください。サンプルコードは次のとおりです。以下のポーズはhttpresponse(つまり応答)であり、メインコンテンツはStringEntity (i.e. getEntity())in form of inputStream(i.e. getContent())内に含まれています。

InputStream rescontent = response.getEntity().getContent();
tsResponse=(TsResponse) transformer.convertFromXMLToObject(rescontent );
5
Amit Ty

入力ストリームが適切に閉じられていないと、この例外が発生する場合があります。確認:使用する入力ストリームが何らかの方法で「前」に使用されていない場合は、読みたい場所。つまり、単一の操作で同じ入力ストリームから2回目に読み取った場合、2回目の呼び出しでこの例外が発生します。また、finallyブロックなどの入力ストリームを必ず閉じてください。

3
supernova

XMLファイルは正しい文字エンコーディングになっていますか? FileReaderは常にプラットフォームのデフォルトエンコーディングを使用するため、「作業」サーバーのデフォルトエンコーディングが(たとえば)ISO-8859-1で、「問題」サーバーがUTF-8を使用している場合、XML ASCII以外の文字が含まれています。

FileReaderではなくFileInputStreamからInputSourceを作成した場合、機能しますか?

2
Ian Roberts

この例では、空AndroidManifest.xmlでした。

Eclispeのアップグレード中に 通常の問題 に遭遇し、AndroidManifest.xmlは、上書きされた後、ビルドスクリプトによってSVNにチェックインされている必要があります。

コマンドラインからではなく、Eclipse内からコンパイルすることで見つけました。

1
Danny Schoemann