Проблема с SAXparser

104
3

Я внедрил 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-14T13:29:00+04:00 8 лет назад
1
Решение
57

Если </Description> является закрывающим тегом (т.е. Он не открывает тэг <Description> и текстовое значение), то этот синтаксис совершенно корректен.

Трудно точно сказать, что вызывает ошибку, не видя методы обратного вызова (например, метод startElement), но есть одна важная проблема, которую вы можете проверить

Метод синтаксического анализа SAX выдает illegalArguementException если InputStream имеет значение null. Возможно, стоит проверить значение, поступающее в парсер SAX.

Вы можете использовать следующий код для проверки входного потока для нулей.

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

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

ответил(а) 2012-09-14T17:26:00+04:00 8 лет назад
41

Соединение может закрыться до загрузки всех данных. Попробуйте использовать 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-15T10:34:00+04:00 8 лет назад
40

<Description/> - проблема сборки xml для SAXParser. взгляните на структуру.

В идеале это должно быть </Description> как закрывающий тег.

Для самозакрывающихся тегов SAXParser будет считать это закрывающим тегом.

Поэтому вместо startElement вы получите звонок от endElement.

ответил(а) 2012-09-14T14:10:00+04:00 8 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема