我已经在我的应用程序中实现了一个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/>。
任何关于如何解决这个问题的建议都将不胜感激。
发布于 2012-09-14 22:26:55
如果</Description>是一个自动结束标记(即它没有开始<Description>标记,也没有文本值),那么这个语法是完全正确的。
如果不查看回调方法(例如startElement方法),就很难确切地说出是什么导致了错误,但是有一个主要的gottcha可以检查
如果InputStream为空,SAX解析方法将抛出illegalArguementException。检查进入SAX解析器的值可能是值得的。
您可以使用以下代码来检查输入流中是否有空值。
InputStreamReader reader = new InputStreamReader(url.openStream());
if (!reader.ready()) {
System.out.println("error");
}发布于 2012-09-14 19:10:45
<Description/>是SAXParser的xml构造问题。看一下这个结构。
理想情况下,它应该是</Description>作为结束标记。
对于自动结束标记,SAXParser会将其假定为结束标记。
因此,您将收到来自endElement的调用,而不是startElement。
发布于 2012-09-15 15:34:22
连接可能会在所有数据下载之前关闭。尝试使用BufferedInputStream,看看是否有帮助:
BufferedInputStream _url_ = new BufferedInputStream(new URL(feedUrl).openStream());
...
BufferedReader isr = new BufferedReader(new InputStreamReader(_url_));
InputSource is = new InputSource(isr);
xr.parse(is);https://stackoverflow.com/questions/12422703
复制相似问题