Сумма элементов DOM с использованием XPath - PullRequest
0 голосов
/ 06 июня 2011

Я использую MSXML v3.0 в приложении VB 6.0.Приложение вычисляет сумму атрибута всех узлов, используемых для каждого цикла, как показано ниже

Set subNodes = docXML.selectNodes("//Transaction")
For Each subNode In subNodes
total = total + Val(subNode.selectSingleNode("Amount").nodeTypedValue)
Next

Этот цикл занимает слишком много времени, иногда для 60 тысяч узлов требуется 15-20 минут.Я ищу решение XPath / DOM для устранения этого цикла, вероятно

docXML.selectNodes("//Transaction").Sum("Amount")

или

docXML.selectNodes("Sum(//Transaction/Amount)")

Приветствуются любые предложения, чтобы получить эту сумму быстрее.

Ответы [ 2 ]

0 голосов
/ 07 июня 2011

Любое решение, использующее псевдо-оператор 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.

0 голосов
/ 06 июня 2011

// Открыть XML. docNav = новый XPathDocument (@ "c: \ books.xml");

// Создать навигатор для запроса с XPath. nav = docNav.CreateNavigator ();

// Находим сумму // Это выражение использует стандартный синтаксис XPath. strExpression = "сумма (/ книжный магазин / книга / цена)";

// Используйте метод Evaluate для возврата оцененного выражения. Console.WriteLine («Сумма цены книг: {0}», nav.Evaluate (strExpression));

источник: http://support.microsoft.com/kb/308333

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...