Любое решение, использующее псевдо-оператор XPath //
в документе XML с 60000+ узлами, будет довольно медленным , поскольку //x
вызывает полный обход дерева, начиная скорень документа.
Решение может быть значительно ускорено, если используется более точное выражение XPath, которое не включает псевдо-оператор //
.
Если вам известна структура XML-документа, всегда используйте определенную цепочку шагов расположения - никогда //
.
Если вы приведете небольшой пример, показывающий конкретную структуру документа, томногие люди смогут предложить более быстрое решение, чем любое решение, использующее //
.
Например, если известно, что все элементы Transaction
могут быть выбраны с помощью этого выражения XPath:
/x/y/Transaction
, тогда оценка
sum(/x/y/Transaction/Amount)
, вероятно, будет значительно быстрее, чем Sum(//Transaction/Amount)
Обновление :
ОПпоказал в комментарии тЕсли структура XML-файла довольно проста.
Соответственно, я попытался с XML-документом с 60000 Transaction
узлами сделать следующее:
/*/*/Amount
.в качестве хоста для механизма XPath использовался XSLT) для получения суммы потребовалось 220 мс (миллисекунд), что означает 0,22 с.
С MSXML3 это занимает 334 с.76 секунд - все еще довольно медленно.
Заключение : это ошибка в MSXML3 - попробуйте перейти на другой движок XPath, такой как тот, который предлагается .NET.