代码之家  ›  专栏  ›  技术社区  ›  Bob77

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

  •  0
  • Bob77  · 技术社区  · 15 年前

    在重用之前,是否有快速的方法清除msxml2.domDocument对象的先前内容?我一直习惯于丢弃它们并每次创建一个新的实例,但这对我来说是浪费,并且分析一些测试用例似乎证实了这一点。

    在这种情况下,为了可移植性,我坚持使用MSXML 3.0,并且我意识到在使用XPath选择大型节点集时,这个旧版本有一些奇怪之处。尝试选择整个文档树,然后删除它会感觉不干净,运行速度也不像我希望的那样快。MSXML 3.0使用的“懒惰选择”也不能激发信心:

    selectNodes Method

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

    我还认识到,重用这样的对象需要注意不同属性(selectionLanguage等)的当前设置,这些设置可能会在使用之间徘徊。不过,我认为这不应该有什么大不了的,特别是如果重用始终遵循相同的模式。

    我想我接下来要做的是清除加载的DOM以重新使用它的一些干净快速的方法,或者更多地输入为什么重新使用可能比娱乐更糟糕。

    1 回复  |  直到 13 年前
        1
  •  2
  •   Samuel Zhang    13 年前

    您可以考虑迁移到MSXML6:

    1. 首先,msxml6与winxp sp3、vista、windows一起使用。 Server 2008、Win7和Windows Server 2008 R2。唯一支持的操作系统 微软没有MSXML6的是Windows 2003,其中 您必须让客户下载MSI。总的来说,msxml6是 几乎和MSXML3一样可移植。
    2. 与支持XSL模式和xpath的msxml3不同,msxml6只支持xpath,其中selectnodes和selectsinglenode只在快照上下文中工作。
    3. 与getElementsByTagname不同,快照语义是由W3C定义的。 MSXML6具有更好的性能和W3C遵从性。

    此外,您不应该像MSXML那样太在意每次使用后清理文档。 Garbage Collection 在内部,这意味着您在替换document元素时将无法取回内存。我的建议是通过一个特定的清理工作来实现安宁,只需在下一次加载时重用实例,或者使用dom api重建树。如果内存使用真的是个大问题, XmlLite 能让你完全控制。

    推荐文章