30

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

7 回答 7

36

当你这样做时,

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

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

Document doc = builder.parse(instream);

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

于 2012-04-05T05:36:36.283 回答
4

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

于 2017-06-05T01:21:21.533 回答
3

对于那些到达此帖子以获得答案的人:

这主要是因为正在InputStream使用的 DOM 解析器是空的

所以在我遇到的情况下,可能有两种情况:

  1. 您传递给解析器的InputStream已被使用并因此被清空。
  2. File您创建的 from 或任何内容可能InputStream是空文件或字符串或其他任何内容。空虚可能是导致问题的原因。所以你需要检查你的来源InputStream
于 2017-08-16T06:46:23.763 回答
1

我遇到了同样的错误,并且可以通过记录异常轻松找到问题所在:

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

或者,您可以不记录错误,而是在处理条目的地方使用throwcatch,这样您就可以打印条目本身以更好地指示错误。

于 2015-03-01T08:57:18.423 回答
1

使用一次输入流不要多次使用它并执行 inputstream.close()

于 2020-03-30T08:05:16.597 回答
1

我通过将源提要从http://www.news18.com/rss/politics.xml转换为https://www.news18.com/rss/politics.xml解决了这个问题

使用 http 下面的代码正在创建一个空文件,这导致了问题

    String feedUrl = "https://www.news18.com/rss/politics.xml"; 
    File feedXmlFile = null;

    try {
    feedXmlFile =new File("C://opinionpoll/newsFeed.xml");
    FileUtils.copyURLToFile(new URL(feedUrl),feedXmlFile);


          DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
          DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
          Document doc = dBuilder.parse(feedXmlFile);
于 2019-12-18T21:44:56.060 回答
-3

另一个原因是,您应该在 mongodb 设置中将您的 IP 地址 (IPv4) 列入白名单。希望能解决!

于 2019-08-06T03:43:59.020 回答