为什么我收到此错误文件过早结束?

新手上路,请多包涵

我正在尝试解析 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)

原文由 Fabii 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

当你这样做时,

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

您在流内消耗所有内容,因此流内是空的。现在,当尝试这样做时,

 Document doc = builder.parse(instream);

解析将失败,因为您向其传递了一个空流。

原文由 sbridges 发布,翻译遵循 CC BY-SA 3.0 许可协议

您收到错误是因为 SAXBuilder 不够智能,无法处理“空白状态”。因此,它至少会查找 <xml ..> 声明,当这导致无数据响应时,它会创建您看到的异常,而不是报告空状态。

原文由 mist42nz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题