0

我已经在我的应用程序中实现了一个 SAXparser,它以前运行良好,但是我在处理新的 XML 文档时遇到了问题。

这是我的解析器

public List<Article> getLatestArticles(String feedUrl) {
URL url = null;
    try {

        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

        url = new URL(feedUrl);

        xr.setContentHandler(this);
        xr.parse(new InputSource(url.openStream()));


    } catch (IOException e) {
        Log.e("RSS Handler IO", e.getMessage() + " >> " + e.toString());
    } catch (SAXException e) {
        Log.e("RSS Handler SAX", e.toString());
    } catch (ParserConfigurationException e) {
        Log.e("RSS Handler Parser Config", e.toString());
    }
    catch (java.lang.IllegalArgumentException e){
        Log.e("RSS Handler lang", e.getMessage() + " >> " + e.toString());
    }

    return articleList;
}

解析器启动正常,但随后出现java.lang.IllegalArgumentException错误。我相信这可能是由于我的 xml 提要中有一个没有价值的元素,它看起来像这样<Description/>

任何有关如何解决此问题的建议将不胜感激。

4

3 回答 3

1

如果</Description>是一个自闭合标签(即它没有开始<Description>标签并且没有文本值)那么这个语法是完全正确的。

如果不查看回调方法(例如 startElement 方法),很难准确判断是什么导致了错误,但是您可以检查一个主要问题

illegalArguementException如果 InputStream 为空,SAX 解析方法将抛出一个。检查进入 SAX 解析器的值可能是值得的。

您可以使用以下代码检查输入流中的空值。

InputStreamReader reader = new InputStreamReader(url.openStream());

if (!reader.ready()) {
    System.out.println("error");
}
于 2012-09-14T14:26:54.977 回答
0

<Description/>是 SAXParser 的 xml 构造问题。看看结构。

理想情况下,它应该</Description>作为结束标签。

对于自闭合标签,SAXParser 将假定它为闭合标签。

因此,startElement您将收到来自 的电话,而不是您endElement

于 2012-09-14T11:10:45.087 回答
0

连接可能在所有数据下载之前关闭。尝试使用 BufferedInputStream 看看是否有帮助:

BufferedInputStream _url_ = new BufferedInputStream(new URL(feedUrl).openStream());

...

BufferedReader isr = new BufferedReader(new InputStreamReader(_url_));
InputSource is = new InputSource(isr);
xr.parse(is);
于 2012-09-15T07:34:22.080 回答