我将根据本机 win32 COM API 来描述解决方案;在 C# 中编写互操作(或在 pinvoke.net 上找到)应该不会太难。或者,您可能需要使用托管对象公开的属性来获取本机对象。
您自己构建 DOM 的速度可能不会比 IE 的解析器快,因此创建一个空白 HTMLDocument(在本机代码中为 CoCreateInstance(CLSID_HTMLDocument))和 QueryInterface() 用于其 IMarkupServices 实现的 HTMLDocument。还使用 IMarkupServices::CreateMarkupPointer() 方法创建两个 IMarkupPointer。
接下来调用 IMarkupServices::ParseString() 来解析您的 HTML。这将为您提供一个指向包含您的 DOM 的 IMarkupContainer 的指针,以及指向您的 DOM 开头和结尾的两个 IMarkupPointer。现在您可以使用 IMarkupServices::Move() 将数据从一个 IMarkupContainer 移动到另一个。
因此,您将使用的一般方案是拥有一个 HTMLDocument,它是您的“显示”文档,并且它与 IMarkupContainer 相关联(您可以只使用 QueryInterface() )。然后你有一个向量或列表或所有非显示标记容器中的任何一个。然后,您只需为显示文档创建一个标记指针,调用 IMarkupPointer::MoveToContainer(displayDocumentContainer, true),然后使用它将内容从显示容器移动到不显示的容器,反之亦然。
需要注意的一件事:您只能在创建它们或获取它们的线程上访问这些对象。所有 IE 对象都是 STA 对象。如果需要多线程访问,则必须编组。
如果您有具体的后续问题,请告诉我。
参考: