Разбор Android DOM слишком медленный

Я пытаюсь проанализировать веб-ответ с помощью анализатора DOM следующим образом:

public static Document parseDocument(InputStream sr) throws Exception {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    dbf.setIgnoringComments(true);
    dbf.setIgnoringElementContentWhitespace(true);
    dbf.setCoalescing(true);
    //dbf.setValidating(false);
    Document xdoc = dbf.newDocumentBuilder().parse(new InputSource(sr));
    xdoc.normalize();
    return xdoc;
}

Проблема в том, что

Document xdoc = dbf.newDocumentBuilder().parse(new InputSource(sr));

выполняется 3 мин. В моем XML-файле 3800 строк. Является ли это нормальным и как это улучшить?

Спасибо.


person Milos Cuculovic    schedule 22.02.2012    source источник


Ответы (1)


Это слишком много для синтаксического анализа DOM в Android. Потребление памяти и выделение объектов недопустимы. SAX, как и в предыдущем ответе, является работоспособным решением, но Pull-Parser (также содержащийся в API-интерфейсах Android) является лучшим и более современным выбором, так как его легче программировать (при этом анализатор SAX управляет обработкой и отправляет события XML вашему обработчику, в то время как XPP это ваше приложение управляет синтаксическим анализатором и извлекает события xml из потока)

Еще лучшим выбором будет какая-нибудь облегченная структура привязки данных, построенная поверх парсера pull — jackson, xstream и т. д. Они будут доставлять только объекты — вам вообще не нужно беспокоиться о парсинге xml.

person Konstantin Pribluda    schedule 22.02.2012
comment
Спасибо за этот ответ. Где я могу найти подходящий пример Pull-Parser? - person Miloš; 22.02.2012