Насколько эффективен XPath по сравнению с использованием DOM в Dom4J? - PullRequest
4 голосов
/ 31 марта 2009

Например, рассмотрим следующий xml

<root>
  <childNode attribute1="value1">
     <grandChildNode attrib1="val1" attrib2="val2">some content1
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content2
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content3
     </grandChildNode>
  </childNode>
  <childNode attribute1="value1">
     <grandChildNode attrib1="val1" attrib2="val2">some content1
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content2
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content3
     </grandChildNode>
  </childNode>
  <childNode attribute1="value1">
     <grandChildNode attrib1="val1" attrib2="val2">some content1
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content2
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content3
     </grandChildNode>
  </childNode>
</root>

Будет ли эффективно использование DOM для получения корневого узла, затем циклический переход по childNode и grandChildNode или использование выражений XPath для сбора сведений о дочерних и grandChild узлах?

1 Ответ

8 голосов
/ 07 апреля 2009

Если вы хотите полностью обработать XML-документ, анализ XML в DOM почти всегда будет наименее эффективным с точки зрения времени десериализации, использования ЦП и использования памяти.

Для анализа DOM требуется примерно в 10-15 раз больше памяти, поскольку для документа XML требуется место на диске. Например, XML-документ объемом 1 мегабайт будет анализироваться в DOM, занимая 10-15 мегабайт памяти.

Анализировать DOM можно только в том случае, если вы собираетесь изменить некоторые или все данные, а затем поместить результат обратно в XML-документ. Для всех других случаев использования DOM является плохим выбором.

XPath часто значительно менее ресурсоемок, но это зависит от длины документа (т. Е. Сколько у вас элементов childNode) и расположения в документе данных, которые вас интересуют.

Использование памяти XPath и время завершения имеют тенденцию увеличиваться по мере продвижения по документу. Например, допустим, у вас есть XML-документ с 20 000 элементов childNode, каждый childNode имеет уникальный идентификатор, который вы знаете заранее, и вы хотите извлечь известный childNode из документа. Для извлечения 18 345-го дочернего узла потребовалось бы гораздо больше, чем для третьего.

Так что, если вы используете XPath для извлечения всех элементов childNode, вы можете найти его менее эффективным, чем синтаксический анализ в DOM. Обычно XPath - это простой способ извлечь часть XML-документа. Я бы не рекомендовал использовать его для обработки всего документа XML.

Безусловно, наилучшим подходом, если вы действительно хотите извлечь и обработать все данные в XML-документе, было бы использование читателя на основе SAX. Это будет на несколько порядков быстрее и менее ресурсоемким, чем любой другой подход.

Тем не менее, это также зависит от объема данных, с которыми вы имеете дело. Для приведенного вами примера XML-документа вы не заметите никакой практической разницы. Да, DOM будет «медленным», а SAX - «быстрым», но мы говорим о миллисекундах или микросекундах.

SAX может быть в сотни или тысячи раз быстрее, чем DOM, однако, если это разница между 2 микросекундами и 2 миллисекундами, вы не заметите. Когда вы работаете с документом, содержащим 20 000 элементов childNode, 2 секунды по сравнению с 200 секундами станут большей проблемой.

...