错误解析RSS - > org.xml.sax.SAXParseException; lineNumber:1; columnNumber:1;文件过早结束

时间:2017-08-26 07:15:34

标签: java xml parsing inputstream domparser

我有一个方法可以解析来自不同网址的RSS,效果很好:

  

例如:https://www.clarin.com/rss/lo-ultimo/

但是在其中一个网址( https://www.cio.com/category/mobile/index.rss )和该网络的所有RSS中,当我执行代码时,控制台会向我显示以下错误并且解析器没有不起作用:

  

org.xml.sax.SAXParseException; lineNumber:1; columnNumber:1;文件提前结束。

我正在使用此方法解析RSS提要(代码的一部分):

        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

            URL url = new URL("https://www.cio.com/category/mobile/index.rss");
            URLConnection urlConnection = url.openConnection();
            InputStream inputStream = urlConnection.getInputStream();

            Document doc = dBuilder.parse(inputStream);

错误发生在最后一行 - > 文档doc = dBuilder.parse(inputStream);

在那段代码中我从url解析RSS,奇怪的是当我直接从文件解析RSS(index.rss)时我没有错误并且解析效果很好,我这样做:

  

File fXmlFile = new File("index.rss");

     

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();

     

DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

     

Document doc = dBuilder.parse(fXmlFile);

     

Document doc = dBuilder.parse(inputStream);

     

doc.getDocumentElement().normalize();

注意:

  
      
  • 这是一个maven webapp项目。
  •   
  • 部署在Tomcat 9.0服务器中。
  •   
  • 当我按下网页主页面上的按钮时,该方法会运行。
  •   
     

我提到这一点,因为当我尝试使用一个简单的java项目时,解析器也能正常使用inputStream。

如果你能帮助我,我将非常感谢,谢谢!

1 个答案:

答案 0 :(得分:0)

我运行了以下代码,它运行正常,没有错误。

     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

        URL url = new URL("https://www.cio.com/category/mobile/index.rss");
        URLConnection urlConnection = url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();

        Document doc = dBuilder.parse(inputStream);
        Element root = doc.getDocumentElement();
        NodeList children = root.getChildNodes();

        for (int i = 0; i < children.getLength(); i++) {
             System.out.println(children.item(i));
        }

        inputStream.close();

     }

然后我添加了以下内容并尝试解析一个空文件:

    File fXmlFile = new File("EmptyFile.xml");
    inputStream = new FileInputStream(fXmlFile);
    doc = dBuilder.parse(inputStream);
    System.out.println(doc.getDocumentElement());

当文件为空(或只包含XML处理指令)时,我收到了您收到的错误。当我添加根元素时,错误消失了。在我看来,这证明当inputStream(或者它正在流式传输的东西)基本上是空的时会发生这个错误。这个理论似乎也得到了org.xml.sax.SAXParseException: Premature end of file for *VALID* XML的支持。因此,我建议,如果您仍然收到此错误,请在URL网址上设置断点...并按照它查看连接是否正确。希望有所帮助。