0

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

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

selectNodes 方法

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

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

我想我所追求的是一些干净和快速的方法来清除加载的 DOM 以重用它,或者更多关于为什么重用可能比娱乐的替代方案更糟糕的输入。

4

1 回答 1

2

您可以考虑迁移到 MSXML6:

  1. 首先,MSXML6 与 WinXP SP3、Vista、Windows Server 2008、Win7 和 Windows Server 2008 R2 是内置的。Microsoft 支持的唯一没有 MSXML6 的操作系统是 Windows 2003,您必须让客户下载 MSI。总的来说,MSXML6 几乎与 MSXML3 一样可移植。
  2. 与同时支持 XSL 模式和 XPath 的 MSXML3 不同,MSXML6 仅支持 XPath,其中 SelectNodes 和 SelectSingleNode 仅在快照上下文中工作。
  3. 与 GetElementsByTagName 不同,快照语义是由 W3C 定义的。MSXML6 具有更好的性能和 W3C 合规性。

此外,您不必太在意每次使用后清理文档,因为 MSXML 内部具有垃圾收集,这意味着您在替换文档元素时不会取回内存。我的建议是对特定的清理工作保持平静,只需将实例重用于下一次加载或使用 DOM API 重建树。如果内存使用确实是一个大问题,XmlLite可以让您完全控制。

于 2011-08-05T15:55:53.833 回答