快速清除MSXML文档还是重新创建?

时间:2009-08-30 16:52:41

标签: msxml

是否有一种快速方法可以在重用之前清除MSXML2.DOMDocument对象的先前内容?我一直习惯于丢弃它们并每次都创建一个新的实例,但这让我觉得浪费,并且几个测试用例的分析似乎证实了这一点。

在这种情况下,我坚持使用MSXML 3.0来实现可移植性,并且我意识到这个旧版本在使用XPath选择大型节点时有些怪癖。试图选择整个文档树然后删除它并不会感觉干净,也不会像我想的那样快速运行。 MSXML 3.0使用的“懒惰选择”也没有激发信心:

selectNodes Method

  

以前,在MSXML 3.0及更早版本中,通过调用selectNodes方法创建的选择对象将逐渐计算节点集。如果修改了DOM树,而selectNodes调用仍在主动迭代其内容,则该行为可能会更改已选择或返回的节点。在MSXML 4.0及更高版本中,节点集结果在选择时完全计算。这确保了迭代简单且可预测。在极少数情况下,此更改可能会影响为了适应以前的行为而编写的遗留代码。

我也意识到重用这样的对象需要注意可能在使用之间徘徊的不同属性(SelectionLanguage等)的当前设置。我认为这不应该是一个大问题,特别是如果重复使用总是遵循相同的模式。

我认为我之后的目标是清除加载的DOM以重复使用它的一些干净而快速的方法,或更多的输入,以解释为什么重用可能比娱乐的替代方案更差。

1 个答案:

答案 0 :(得分:2)

您可以考虑迁移到MSXML6:

  1. 首先,MSXML6是WinXP SP3,Vista,Windows的开箱即用产品 Server 2008,Win7和Windows Server 2008 R2。唯一受支持的OS 由微软在没有MSXML6带的情况下是Windows 2003,其中 你必须让客户下载MSI。总的来说,MSXML6是 几乎和MSXML3一样便携。
  2. 与支持XSL Pattern和XPath的MSXML3不同,MSXML6仅支持XPath,其中SelectNodes和SelectSingleNode仅在快照上下文中工作。
  3. 与GetElementsByTagName不同,快照语义是由W3C定义的。 MSXML6具有更好的性能和W3C兼容性。
  4. 此外,每次使用后都不应过多关注清理文档,因为MSXML内部有Garbage Collection,这意味着在替换文档元素时不会获得内存。我的建议是通过特定的清理工作实现和平,只需重复使用实例进行下一次加载或使用DOM API重建树。如果内存使用真的是一个大问题,XmlLite可以让你完全控制。