Могу ли я сделать возвращение SAXParser.parse () до того, как он проанализирует весь InputStream? - PullRequest
0 голосов
/ 10 сентября 2011

Я пытаюсь проанализировать бесконечный поток XML, который выглядит следующим образом:

<outer>
  <foo>footext</foo>
  <bar>bartext</bar>
</outer>
<outer>
  <foo>footext</foo>
  <bar>bartext</bar>
</outer>
<outer>
  <foo>footext</foo>
  <bar>bartext</bar>
</outer>
...

У меня настроен SAXParser:

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser parser = factory.newSAXParser();

И я могу вызвать его с помощью InputStream и моей реализации Defaulthandler достаточно легко:

parser.parse(theInputStream, myHandler);

Проблема в том, что мне нужен parser.parse для фактического возврата после того, как он достигнет конечного тега </outer>, чтобы я мог вернуть объект, который я проанализировал из xml. Причина этого в том, что мой код синтаксического анализа (в классе с именем XMLParser) вызывается в цикле, подобном следующему:

while(condition) {
    Object o = xmlParser.getNextObject();
    ... do something with the object ...
}

Можно ли сделать возврат SAXParser из вызова parse (InputStream, DefaultHandler) до того, как он прочитает весь доступный поток?

1 Ответ

0 голосов
/ 11 сентября 2011

В этой статье IBM используется метод исключения. Обычно вы не должны использовать исключения для управления потоком программ, но это может быть самый простой способ для вас.

Я бы не рекомендовал использовать ваниль SAXException. Создайте подкласс типа DataOfInterestFoundException и бросьте его. Тогда ваш код, который вызывает синтаксический анализ SAX, может перехватить этот тип исключения, чтобы нормально остановиться, и рассматривать все остальное как подлинное исключение.

Другое решение может заключаться в том, чтобы обернуть входной поток одним из ваших собственных, который каким-то образом способен убедить парсер SAX остановиться. Не уверен, что вы можете сделать это, хотя.

...