2011-06-06 50 views
0

我在VB 6.0应用程序中使用MSXML v3.0。该应用程序计算如下图所示使用XPath的DOM元素总和

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

这个循环花费过多时间,有时也需要15-20分钟60000个节点使用每个循环中所有节点的属性的总和。 我要寻找的XPath/DOM,要彻底解决这个循环中,可能

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

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

任何建议是值得欢迎的更快得到这笔钱。

回答

0

//打开XML。 docNav =新的XPathDocument(@“c:\ books.xml”);

//创建一个导航器用XPath查询。 nav = docNav.CreateNavigator();

//查找总和 //此表达式使用标准的XPath语法。strExpression =“sum(/ bookstore/book/price)”;

//使用Evaluate方法返回评估的表达式。 Console.WriteLine(“书籍的价格总和为{0}”,nav.Evaluate(strExpression));

来源:http://support.microsoft.com/kb/308333

+0

当我使用VB 6.0时,您指定的来源清楚地提到“...通过使用Visual C#”,而我使用VB 6.0 – bjan 2011-06-06 15:09:04

0

开始在该使用XPath //伪操作XML文档上有60000+的节点将是相当缓慢,因为//x引起的任何解决方案的树的遍历完整文档的根。

如果使用更精确的XPath表达式,则不会包含//伪操作符,可以显着提高解决方案的速度。

如果您知道XML文档的结构,请始终使用特定的位置步骤链 - 从不使用//

如果您提供一个小例子,显示文档的特定结构,那么许多人将能够提供比使用//的任何解决方案更快的解决方案。

/x/y/Transaction 

然后

sum(/x/y/Transaction/Amount) 

评价很可能是显著快于Sum(//Transaction/Amount)

例如,如果已知所有Transaction元件可以使用该XPath表达式选择

更新

OP在评论中透露,XML文件的结构非常简单。

因此,我试着用60000个Transaction节点的XML文档如下:

/*/*/Amount 

在.NET XslCompiledTransform(是的,我用XSLT作为主机的XPath引擎)这场耗时220ms内(毫秒),这意味着0.22秒,以产生总和。

使用MSXML3需要334秒。

使用MSXML6需要76秒 - 仍然很慢。

结论:这是MSXML3中的一个错误 - 尝试升级到另一个XPath引擎,例如.NET提供的引擎。

+0

@bjan:就像...什么? – 2011-06-07 04:52:50

+0

的XML文档的结构是一样 \t \t \t -20011.61 \t \t \t \t \t bjan 2011-06-07 04:54:33

+0

我什特定的链条,但循环仍需要时间。实际上,查找节点列表的代码并不慢,但循环遍历它们以找到总和较慢。 – bjan 2011-06-07 09:33:21