web-dev-qa-db-ja.com

なぜこのエラーが発生するのですか?

解析しようとしています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)
26
Fabii

これを行うと、

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

インストリームですべてを消費するため、インストリームは空です。これをしようとすると、

Document doc = builder.parse(instream);

空のストリームを渡したため、解析は失敗します。

30
sbridges

SAXBuilderが「空白状態」を処理するのに十分にインテリジェントではないため、エラーが発生しています。したがって、少なくとも<xml ..>宣言、およびそれがデータなし応答を引き起こすと、空の状態を報告するのではなく、表示される例外を作成します。

3
mist42nz

回答のためにこの投稿に到達した人のために:

これは主に、DOMパーサーが消費しているInputStreamが空であるために発生します

だから私が出会ったものには、2つの状況があるかもしれません:

  1. パーサーに渡したInputStreamが使用されたため、空になりました。
  2. FileまたはInputStreamを作成したものは、空のファイルまたは文字列などです。空虚が問題の原因である可能性があります。したがって、InputStreamのソースを確認する必要があります。
2
cinqS

私は同じエラーに出くわし、例外をログに記録することで問題を簡単に見つけることができました。

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);
    }
});

または、エラーをログに記録する代わりに、throw itおよびcatch itでエントリを処理することができます。そのため、エントリ自体を印刷して、エラーに関するより良い指示を得ることができます。

1
Maroun

他の理由の1つは、mongodb設定でIPアドレス(IPv4)をホワイトリストに登録する必要があることです。それが解決することを願っています!

0
Reju Koshy