Каков наиболее эффективный способ адресации элемента в XPath?
У меня есть Java-программа, которая заботится об эффективности. Там я использую XPath.
В XPath я могу выбрать элементы, начиная с корня
/root/a/b/c/d/e
или используйте descendent-or-self
ось:
//e
Какой метод будет наиболее эффективным среди этих двух?
3 ответа
Прямой путь будет иметь тенденцию работать лучше, чем при использовании более общего потомка или себя (//
) ось, однако:
- Реализации могут отличаться (но, как правило, прямые пути работают лучше).
- Разница может быть достаточно незначительной, чтобы не иметь значения, особенно для небольших документов.
- Как и в случае всех проблем с производительностью, проведите измерения перед оптимизацией, чтобы избежать чрезмерных усилий в областях, отличных от узких мест.
Я полагаю, что / root / a / b / c / d / e будет более эффективным, потому что в первом случае процессор XPath может устранить множество ветвей, тогда как во втором случае (//e) процессор XPath должен искать по всему дереву документа.
Вы должны написать небольшую Java-программу, которая анализирует два разных способа, а затем посмотреть, сколько времени потребуется для запуска 1000 циклов.
Понимание ведущих /
а также //
конструкции очень важны.
Ведущий /
запускает путь, который всегда имеет отношение к корневому узлу. Поэтому, хотя мы ищем подузел, XPath:
root/a/b/c
... все равно вернется каждый c
узел в вашем документе XML, даже если они не являются потомками первого c
узел. Аналогично, XPath:
//e/
... все равно вернется каждый e
узел в вашем XML-документе, а не только потомки вашего первого c
узел.