2012-04-05 24 views
20

私は構文解析しようとしており、XML responseですが、私は悲惨に失敗しています。私は最初に と答えて、xmlが応答で返されていないだけなので、私はxmlオンラインファイルへの直接リンクでコードを作りました。 XMLを問題なく画面に印刷できます。しかし、私が私の解析メソッドを呼び出すと、私は得るファイルの早すぎる終わり。このエラーが発生するのはなぜですか?ファイルの終わりが早すぎますか?

私が直接URLを渡す場合、それは動作します:

  • builder.parse( "");

は、しかし、私はInputStreamを通過した際に失敗します。

  • builder.parse(connection.getInputStream());

    try { 
        URL url = new URL(xml); 
        URLConnection uc = url.openConnection(); 
        HttpURLConnection connection = (HttpURLConnection)uc; 
    
        connection.setDoInput(true); 
        connection.setDoOutput(true); 
    
        InputStream instream; 
        InputSource source; 
        //get XML from InputStream 
        if(connection.getResponseCode()>= 200){ 
         connection.connect();  
         instream = connection.getInputStream();   
         parseDoc(instream);  
        } 
        else{ 
         instream = connection.getErrorStream(); 
        } 
    
    
    } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } catch (ParserConfigurationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } catch (SAXException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } 
    
    
    
    static void parseDoc(InputStream instream) throws ParserConfigurationException, 
    SAXException, IOException{ 
    
    
        BufferedReader buff_read = new BufferedReader(new InputStreamReader(instream,"UTF-8")); 
        String inputLine = null; 
    
        while((inputLine = buff_read.readLine())!= null){ 
         System.out.println(inputLine); 
        } 
    
        DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(); 
        factory.isIgnoringElementContentWhitespace(); 
        DocumentBuilder builder = factory.newDocumentBuilder(); 
        Document doc = builder.parse(instream); 
    } 
    

私は取得していますエラー:

[Fatal Error] :1:1: Premature end of file. 
org.xml.sax.SAXParseException: Premature end of file. 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) 
    at com.ameba.api.network.MainApp.parseDoc(MainApp.java:78) 
    at com.ameba.api.network.MainApp.main(MainApp.java:41) 
+0

解析しようとしているXMLファイルがありますか。ファイルの早期終了はXMLファイルが完全ではないことを示します。ここでURL接続を使用しているため、ネットワークの問題が疑われます。この問題を解決する最善の方法は、このXMLファイルをwiresharkまたはTCPモニタの種類のツールを使用してキャプチャし、それが完全かどうかを確認することです。 – NiranjanBhat

+0

@NiranjanBhat。はい、XMlは完全で有効です。私はこのXMLを直接リンクで解析しています。そのエラーは、InputStreamを使用する場合にのみ発生するようです。 – Fabii

+0

POSTを実行しているのにデータを送信していないのはなぜですか? – EJP

答えて

25

をあなたがこれを行うと、

while((inputLine = buff_read.readLine())!= null){ 
     System.out.println(inputLine); 
    } 

あなたはインストリーム内のすべてを消費するので、インストリームは空です。これをしようとすると、空のストリームが渡されたため、解析が失敗します。

+0

私はreadLine()ステートメントを削除しました。しかし、私はまだ同じエラーが発生しています。私がxmlへの直接リンクを提供すれば、それは機能します。 Connection.getInputStream()を使用して処理しようとすると、そのエラーがスローされます。 – Fabii

+0

返されていたストリームに関する問題もありました。問題が解決しました。 – Fabii

+2

@Fabii返されるストリームの問題は何ですか?同じ問題が出ているので私は知りたい。 – NobleUplift

0

私は同じエラーに出くわした、と簡単に例外をロギングすることで問題があったものを見つけることができる:

documentBuilder.setErrorHandler(new ErrorHandler() { 
    @Override 
    public void warning(SAXParseException exception) throws SAXException { 
     log.warn(exception.getMessage()); 
    } 

    @Override 
    public void fatalError(SAXParseException exception) throws SAXException { 
     log.error("Fatal error ", exception); 
    } 

    @Override 
    public void error(SAXParseException exception) throws SAXException { 
     log.error("Exception ", exception); 
    } 
}); 

または、代わりにエラーをログに記録するの、あなたが扱うこととcatchそれthrowすることができますエントリを表示することができますので、エラーをよりよく表示するためにエントリ自体を印刷することができます。

1

SAXBuilderが「空白状態」を処理するのに十分なインテリジェントではないため、エラーが発生しています。したがって、少なくとも<xml ..>宣言が検索され、データレスポンスが発生すると、空の状態を報告するのではなく、例外が表示されます。回答のため、このポストに到達した人のために

2

DOMパーサを消費しているInputStreamは、だから私は全体走ったものの中に、二つの状況があるかもしれません

空であるので、これは主に起こる:

  1. パーサーに渡されたInputStreamが使用されており、空になっています。
  2. FileまたはInputStreamを作成したものは、空のファイルや文字列などでもかまいません。空になったことが原因で問題が発生している可能性があります。したがって、InputStreamの出所を確認する必要があります。
関連する問題