Как объединить два запроса XPATH, чтобы избежать двухкратного анализа длинного XML?
У меня есть длинный локальный файл XML, как это:
<root>
<div>this</div>
<div>is</div>
<div>a</div>
...
<div>very</div>
<div>long</div>
<div>list</div>
</root>
Мне нужно знать:
- общее количество элементов div
- положение элемента "очень"
Я знаю, что могу сделать это, запустив эти два запроса 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