【问题标题】:Issue with SAXparserSAXparser 的问题
【发布时间】:2012-09-07 12:16:33
【问题描述】:

我已经在我的应用程序中实现了一个 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 提要中有一个没有价值的元素,它看起来像 &lt;Description/&gt;

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

【问题讨论】:

  • 如果您包含堆栈跟踪和 startElement、endElement 和 characters 方法,我们可以更轻松地提供帮助。

标签: android xml sax saxparser illegalargumentexception


【解决方案1】:

&lt;Description/&gt; 是 SAXParser 的 xml 构造问题。看看结构。

理想情况下,它应该是&lt;/Description&gt; 作为结束标记。

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

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

【讨论】:

  • 唐·罗比,在给任何人否定之前请三思。我很清楚自闭标签。要求使用单独的结束标记而不是自闭标记的原因是,您将从解析器而不是 startElement 获得对 endElement 的调用。just check this.
  • 我实际上很少投反对票。但我确实倾向于对事实错误投反对票。如果答案得到改善,我也会收回它们。您可以尝试在评论中包含您引用的链接中的一些内容。
【解决方案2】:

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

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

...

BufferedReader isr = new BufferedReader(new InputStreamReader(_url_));
InputSource is = new InputSource(isr);
xr.parse(is);

【讨论】:

    【解决方案3】:

    如果&lt;/Description&gt; 是一个自结束标记(即它没有打开&lt;Description&gt; 标记并且没有文本值),那么这个语法是完全正确的。

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

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

    您可以使用以下代码检查输入流中是否存在空值。

    InputStreamReader reader = new InputStreamReader(url.openStream());
    
    if (!reader.ready()) {
        System.out.println("error");
    }
    

    【讨论】:

    • 谢谢,我终于找到了问题所在。它与 SAXparser 无关。我一直在建立一个文章列表,但没有像我应该做的那样把它转移到 JSON 中。这段代码帮助我找到了空值的来源
    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2011-08-06
    • 2011-02-23
    • 2011-03-14
    • 2010-12-02
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多