Как объединить два запроса XPATH, чтобы избежать двухкратного анализа длинного XML?

У меня есть длинный локальный файл XML, как это:

<root>
  <div>this</div>
  <div>is</div>
  <div>a</div>
  ...
  <div>very</div>
  <div>long</div>
  <div>list</div>
</root>

Мне нужно знать:

  1. общее количество элементов div
  2. положение элемента "очень"

Я знаю, что могу сделать это, запустив эти два запроса XPATH (2.0):

1.  count(/root/div)
2.  index-of(/root/div,"very")

но файл XML длинный, поэтому я ненавижу, что механизм синтаксического анализа XML проходит два раза по всему файлу.

Существует ли более быстрая комбинация, которая возвращает, например, массив с двумя результатами, проходя один раз через файл?

3 ответа

Решение

На языке XQUERY:

let $div := /root/div
return
<result>
<cnt>{count($div)}</cnt>
<v-index>{index-of($div, contains(., 'very'))}</v-index>
</result>

Что заставляет вас думать, что вам нужно дважды проанализировать документ XML, чтобы выполнить два запроса XPath? Я не знаю, какой API вы используете для запуска XPath, но я не знаю API, который имеет такое ограничение.

Краткий ответ: Нет, или, по крайней мере, я в этом сомневаюсь.

Длинный ответ: это можно сделать за один проход, но только тем, что вызывает XPath. В псевдокоде:

FIND ALL DIVS USING XPath(/root/div), ASSIGN TO x
VAR i = 0
VAR v = -1
LOOP THROUGH ALL x
    INCREMENT COUNTER i
    IF x' EQUALS 'very' AND v EQUALS -1
        v = i
Другие вопросы по тегам