Android SAXparser的问题

Android SAXparser的问题,android,xml,sax,saxparser,illegalargumentexception,Android,Xml,Sax,Saxparser,Illegalargumentexception,我已经在我的应用程序中实现了一个SAXparser,它以前工作得很好,但是我在使用一个新的XML文档时遇到了问题 这是我的解析器 public List<Article> getLatestArticles(String feedUrl) { URL url = null; try { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSA

我已经在我的应用程序中实现了一个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;
}
public List getLatestArticles(String feedUrl){
URL=null;
试一试{
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp=spf.newSAXParser();
XMLReader xr=sp.getXMLReader();
url=新url(feedUrl);
xr.setContentHandler(此);
parse(新输入源(url.openStream());
}捕获(IOE异常){
Log.e(“RSS处理程序IO”,e.getMessage()+“>>”+e.toString());
}捕获(SAXE异常){
e(“RSS处理程序SAX”,e.toString());
}捕获(ParserConfiguration异常e){
e(“RSS处理程序解析器配置”,e.toString());
}
catch(java.lang.IllegalArgumentException e){
Log.e(“RSS处理程序lang”,e.getMessage()+“>>”+e.toString());
}
退货清单;
}
解析器开始运行正常,但随后出现
java.lang.IllegalArgumentException
错误。我相信这可能是由于在我的xml提要中有一个没有值的元素,它看起来像这样

任何关于如何解决这一问题的建议都将不胜感激

是SAXParser的xml构造问题。看看这个结构

理想情况下,它应该是作为结束标记的

对于自动结束标记,SAXParser将假定它为结束标记

因此,如果
是一个自动关闭标记(即,它没有打开
标记,也没有文本值),那么这个语法是完全正确的,而不是
startElement
您将从
endElement

接到一个调用

如果不查看回调方法(例如startElement方法),很难准确地说出导致错误的原因,但是有一个主要的gottcha可以检查

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

您可以使用以下代码检查输入流是否为空

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

if (!reader.ready()) {
    System.out.println("error");
}

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

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

...

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

如果你包括stacktrace和startElement、endElement和characters方法,我们可以更容易地提供帮助。Don Roby,在给任何人负面消息之前,请三思。我很清楚自动关闭标签。要求使用单独的结束标记而不是自结束标记的原因是,解析器将调用endElement而不是startElement。实际上,我很少投反对票。但我确实倾向于对事实错误投反对票。如果答案有所改进,我也会收回它们。你可以尝试在你的评论中包含你引用的链接中的一些内容。谢谢,我最终发现了这个问题。它与SAXparser无关。我一直在构建一个文章列表,但并没有像我想象的那样将其转换为JSON。这段代码帮助我找到了空值的来源