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 ответа
Сам по себе 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.