Я опишу решение в терминах собственных API-интерфейсов win32 COM; не должно быть слишком сложно написать взаимодействие, чтобы сделать это на C # (или найти его на pinvoke.net). В качестве альтернативы вам может понадобиться использовать свойства, предоставляемые управляемыми объектами, для получения собственных.
Вы вряд ли сможете создать DOM самостоятельно быстрее, чем парсер IE, поэтому создайте пустой HTMLDocument (в нативном коде это будет CoCreateInstance (CLSID_HTMLDocument)) и QueryInterface () HTMLDocument для его реализации IMarkupServices. Также создайте два IMarkupPointers, используя метод IMarkupServices :: CreateMarkupPointer ().
Следующий вызов IMarkupServices :: ParseString () для анализа вашего HTML. Это даст вам указатель на IMarkupContainer, который содержит вашу DOM, так же, как два IMarkupPointer, которые указывают на начало и конец вашей DOM. Теперь вы можете использовать IMarkupServices :: Move () для перемещения ваших данных из одного IMarkupContainer в другой.
Таким образом, общая схема, которую вы бы использовали, это иметь один HTMLDocument, который является вашим «отображаемым» документом, и связанный с ним IMarkupContainer (для которого вы можете просто использовать QueryInterface ()). Тогда у вас есть вектор или список или что-то из всех не отображаемых контейнеров разметки. Затем вы просто создаете указатель разметки для вашего экранного документа, вызываете IMarkupPointer :: MoveToContainer (displayDocumentContainer, true), а затем используете его для перемещения содержимого из контейнера отображения в контейнеры, не отображаемые на экране, и наоборот.
Заметьте одно: вы должны получать доступ к этим объектам только в потоке, из которого вы их создали, или приобретать их. Все объекты IE являются объектами STA. Если вам нужен многопоточный доступ, вы должны выполнить маршал.
Если у вас есть конкретные уточняющие вопросы, дайте мне знать.
Ссылки: