我有一个方法可以解析来自不同网址的RSS,效果很好:
但是在其中一个网址( 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。
如果你能帮助我,我将非常感谢,谢谢!
答案 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网址上设置断点...并按照它查看连接是否正确。希望有所帮助。