Прервать SAX-разбор в середине документа? - PullRequest
1 голос
/ 05 апреля 2010

Я анализирую очень простую XML-схему с парсером SAX в Android.

Пример файла будет

<Lists>
<List name="foo">
<Note title="note 1" .../>
<Note title="note 2" .../>
</List>
<List name="bar">
<Note title="note 3" .../>
</List>
</Lists>

The ... представляет больше данных заметки в качестве атрибутов, которые не важны для вопроса.

Я использую синтаксический анализатор SAX для анализа документа и реализую только методы startElement и 'endElement' HandlerBase для обработки узлов Note и List.

Однако, в некоторых случаях файлы могут быть очень большими и занять некоторое время для обработки. Я хотел бы иметь возможность прервать процесс анализа в любое время (т. Е. Пользователь нажимает кнопку отмены).

Лучший способ, который я придумал, - это генерировать исключение из моего метода startElement при выполнении определенных условий (т. Е. boolean stopParsing верно).

Есть ли лучший способ сделать это?

Я всегда использовал парсеры стиля DOM, поэтому не совсем понимаю парсер SAX.

И последнее замечание: я запускаю его на Android, поэтому у меня будет запущен Parser в рабочем потоке, чтобы пользовательский интерфейс реагировал. Если вы знаете, как можно безопасно завершить поток во время работы парсера, это также ответит на мой вопрос.

1 Ответ

2 голосов
/ 05 апреля 2010

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

XmlPullParser xpp=getResources().getXml(R.xml.lists);
while (xpp.getEventType()!=XmlPullParser.END_DOCUMENT) {
    if (xpp.getEventType()==XmlPullParser.START_TAG) {
        if (xpp.getName().equals("list")) {
            items.add(xpp.getAttributeValue(0));
        }
    }

    xpp.next();
}
...