Soru Neden bu hatayı alıyorum Erken dosya sonu?


Ayrışmaya çalışıyorum ve XML responseama sefil bir şekilde başarısızım. Başlangıçta düşündüm o xml yanıtta geri gönderilmiyordu, bu yüzden aşağıdaki kodu doğrudan bir bağlantıyla oluşturdum xml çevrimiçi dosya. Yazdıramıyorum XML problemsiz ekranlamak. Ancak ayrıştırma yöntemimi çağırdığımda Dosya sonu belirsiz. 

URL'yi doğrudan iletirsem çalışır:

  • builder.parse ( "");

ancak bir InputStream'i geçtiğimde başarısız oluyor:

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

Aldığım hatalar:

    [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)

21
2018-04-05 04:43


Menşei


Ayrıştırmaya çalıştığınız XML dosyasına sahip misiniz? Dosyanın erken sonu, XML dosyanızın tamamlanmadığını gösterir, burada URL bağlantınızı kullandığınız için ağ sorunlarından şüpheleniyorum. Bu sorunu çözmenin en iyi yolu, bu XML dosyasını wireshark veya TCP monitör türlerini kullanarak yakalamak ve ardından tamam olup olmadığını kontrol etmektir. - NiranjanBhat
@NiranjanBhat. Evet, XMl tamam ve geçerli. Bu xml'yi doğrudan bir bağlantıyla ayrıştırdım. Onun bir hata sadece bir InputStream kullanıldığında ortaya çıkıyor gibi görünüyor. - Fabii
Neden bir POST yapıyorsunuz, ancak hiç veri göndermiyorsunuz? - user207421


Cevaplar:


Bunu yaptığınızda,

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

İçerik akışındaki her şeyi tüketirsiniz, bu yüzden bilgi akışı boştur. Şimdi bunu yapmaya çalıştığınızda,

Document doc = builder.parse(instream);

Ayrıştırma başarısız olur, çünkü boş bir akış geçirdiniz.


26
2018-04-05 05:36



ReadLine () deyimini kaldırdım. Ama yine de aynı hatayı alıyorum. Eğer xml ile doğrudan bağlantı kurarsam çalışır. Eğer bu hatayı atarsa, connection.getInputStream () kullanarak işlem yapmaya çalışırsam. - Fabii
Dönen akışla ilgili bir sorun da vardı. Sorun çözüldü. - Fabii
@Fabii Akışın döndürülmesiyle ilgili sorun neydi? Bilmek istiyorum çünkü aynı sorunu yaşıyorum. - NobleUplift
Haklısınız, giriş akışını iki kez okuyamazsınız. Güzel bir açıklama da burada: danielschneller.com/2008/01/... - lu_ko
@sbridges, çok güzel açıkladı! - Baked Inhalf


Yanıt için bu yayına ulaşanlar için:

Bu esas olarak çünkü InputStream DOM ayrıştırıcı tüketiyor boş

Yani karşılaştığım yerde iki durum olabilir:

  1. InputStream ayrıştırıcıya geçtikten sonra kullanıldı ve boşaltıldı.
  2. File ya da ne yarattınız InputStream gelen boş bir dosya veya dizge veya her neyse olabilir. Boşluk problemin sebebi olabilir. Yani kaynağınızın kaynağını kontrol etmeniz gerekiyor. InputStream.

2
2017-08-16 06:46





Hata alıyorsunuz çünkü SAXBuilder "boş durumlarla" başa çıkmak için yeterince akıllı değil. Yani en azından bir tane görünüyor <xml ..> beyanı ve bu, hiçbir veri yanıtına neden olmadığında, boş durumu bildirmek yerine gördüğünüz istisnayı oluşturur.


1
2018-06-05 01:21





Aynı hatayla karşılaştım ve istisnayı kaydederek sorunun ne olduğunu kolayca bulabilirim:

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

Ya da, hatayı günlüğe kaydetmek yerine, throw o ve catch girdileri ele aldığınız yerde, hatayı daha iyi göstermek için girişi kendiniz yazdırabilirsiniz.


0
2018-03-01 08:57