使用XPath的DOM元素之和

使用XPath的DOM元素之和,dom,xpath,vb6,sum,Dom,Xpath,Vb6,Sum,我正在VB6.0应用程序中使用MSXMLV3.0。应用程序使用for each循环计算所有节点的属性之和,如下所示 Set subNodes = docXML.selectNodes("//Transaction") For Each subNode In subNodes total = total + Val(subNode.selectSingleNode("Amount").nodeTypedValue) Next 此循环占用的时间太长,有时需要15-20分钟才能运行6万个节点。 我正

我正在VB6.0应用程序中使用MSXMLV3.0。应用程序使用for each循环计算所有节点的属性之和,如下所示

Set subNodes = docXML.selectNodes("//Transaction")
For Each subNode In subNodes
total = total + Val(subNode.selectSingleNode("Amount").nodeTypedValue)
Next
此循环占用的时间太长,有时需要15-20分钟才能运行6万个节点。 我正在寻找XPath/DOM解决方案来消除这个循环

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

欢迎您提出任何建议,以加快计算速度。

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

//创建导航器以使用XPath进行查询。 nav=docNav.CreateNavigator()

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

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


来源:

任何在具有60000多个节点的XML文档上使用XPath
/
伪运算符的解决方案都会非常慢,因为
//x
会导致从文档根开始的树的完整遍历

如果使用更精确的XPath表达式(不包括
/
伪运算符),则可以显著加快解决方案的速度

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

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

例如,如果已知可以使用此XPath表达式选择所有
事务
元素:

/x/y/Transaction
然后对

sum(/x/y/Transaction/Amount)
可能比
Sum(//交易/金额)

更新

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

因此,我尝试使用60000
事务
节点XML文档执行以下操作:

/*/*/Amount
对于.NET XslCompiledTransform(是的,我使用XSLT作为XPath引擎的主机),生成总和需要220毫秒(毫秒),也就是0.22秒

使用MSXML3需要334秒

使用MSXML6需要76秒——仍然非常慢


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

您指定的源代码清楚地提到“…通过使用Visual C#”当我使用VB 6.0时,xml文档的结构就像-20011.61 1515一样,我甚至尝试了特定的链,但循环仍然需要时间。实际上,查找节点列表的代码并不慢,但遍历它们以查找和的循环速度较慢。@bjan:我已经用一些基准测试和结论/建议更新了我的答案。谢谢,我不能使用.NET,至少因为应用程序是用VB6.0构建的。无论如何,谢谢你。
/*/*/Amount