Android - XPath оценивать очень медленно

Я использую XPath запросить мой XML-file который имеет на данный момент около 100KB,

Я перебираю массив и запрашиваю каждое значение в списке.

К сожалению, один запрос занимает около 3-4 секунд в отладчике и немного меньше при отключенном отладчике.

Есть идеи, почему это так медленно? Я использую Galaxy S2 для тестирования.

Вот мой код:

XPath xpath = XPathFactory.newInstance().newXPath();
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();

Document document = builder.parse(new File(file_on_internal_sd_url)));

int size = mPrefs.getInt("no_ids", 0);
for(int i=0;i<size;i++) {
    String id= mPrefs.getString("id_" + i, null);
    String expression = "/tag1/tag2[@id = '" + id+ "']";
    NodeList nodes = (NodeList) xpath.evaluate(expression, document, XPathConstants.NODESET);
    if(nodes.getLength()>0) {
        myElements.add((Element)nodes.item(0));
    }
}

Обновить

Когда я опускаю XPathConstants.NODESET оценка сделана в кратчайшие сроки, но я не получаю NodeList, Вместо этого он возвращает пустую строку...

2 ответа

Решение

Благодаря @nvrmnd я немного попробовал и нашел лучший парсер:

VTD-XML

Вот пример из разработчиков.

Но этот урок намного лучше...

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

Сам по себе XPath не очень эффективен, когда дело доходит до перебора больших XML-документов. Я сам понял, что анализ значений из XML-файла размером ~200 КБ занял около 10 секунд на младшем устройстве.

После этого я переопределил синтаксический анализатор как SAXParser и увеличил производительность примерно на 2 порядка. Поэтому я бы предложил вам попробовать SAXParser. Это на самом деле не так уж сложно реализовать, и есть пара учебных пособий.

Также существует вопрос о стековом потоке, который касается темы различных методов синтаксического анализа: SAX vs. DOM против XPath.

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

РЕДАКТИРОВАТЬ:

Анализ XML-документа с помощью SAX означает, что вы выполняете его итерацию и сохраняете искомую информацию в объектах. Взгляните на этот урок: SAX Tutorial

There the author parses staff information and transforms it into objects so I guess that's exactly what you need.

Другие вопросы по тегам