2013-07-17 4 views
2

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

Я выполняю итерацию массива и запрос для каждого значения в списке.

К сожалению, один запрос занимает около 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)); 
    } 
} 

Update

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

+0

Является ли запрос _single_ принимать 3-4 мса или все те, в этом цикле вместе ? Как выглядит ваш документ? –

+0

Один запрос занимает около 3-4 секунд (!). В моем документе есть один корневой узел и множество дочерних узлов. Нет внуков. – Ron

+0

Ronvcan вы добавляете тег vtd-xml к этому вопросу? –

ответ

2

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

VTD-XML

Вот example от devlopers.

Но это Tutorial это лучше ...

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

+1

Думаю, вы должны принять свой собственный ответ, чтобы он отображался сверху :) – snrlx

+0

да ... извините за 15 репутации :), но все равно большое спасибо! – Ron

+1

Ответы на собственные вопросы приветствуются и показывают, что вы критически рассмотрели доступные варианты. Для меня это стоит более 15 очков для меня;) – snrlx

1

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

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

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

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

EDIT:

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

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

+0

звучит хорошо.но как я могу запросить анализируемый документ SAX? – Ron

+1

Отредактировано мое сообщение. Надеюсь, поможет. – snrlx

+1

благодарит за вашу помощь. но я думаю, что парсер vtd-xml еще лучше ... – Ron

Смежные вопросы