árvores objeto Edifício HtmlElement
-
08-07-2019 - |
Pergunta
Eu estou usando o controle WebBrowser
MSIE em uma aplicação desktop C # e estou procurando uma maneira de construir e manter árvores de HtmlElement
objetos fora desse controle. Eu estou tentando alternar rapidamente entre várias páginas complexas sem incorrer na sobrecarga do HTML analisar re-a cada vez (e eu não quero manter vários controles que são mostrados / escondidos conforme necessário).
Eu descobri que a) eu só pode criar objetos HtmlElement
via HtmlDocument
do controle e b) uma vez que eu remover um "tronco" de HtmlElement
objetos de HtmlDocument
do controle, ele "morre", apesar de eu continuar mantendo uma forte referência à raiz elemento.
Como posso fazer isso?
P.S. Estou disposto a considerar controles do navegador alternativo (por exemplo Gecko) se me permita realizar a acima.
Solução
Isso vai fazê-lo
// On screen webbrowser control
webBrowserControl.Navigate("about:blank");
webBrowserControl.Document.Write("<div id=\"div1\">This will change</div>");
var elementToReplace = webBrowserControl.Document.GetElementById("div1");
var nodeToReplace = elementToReplace.DomElement as mshtml.IHTMLDOMNode;
// In memory webbrowser control to load fragement into
// It needs this base object as it is a COM control
var webBrowserFragement = new WebBrowser();
webBrowserFragement.Navigate("about:blank");
webBrowserFragement.Document.Write("<div id=\"div1\">Hello World!</div>");
var elementReplacement = webBrowserFragement.Document.GetElementById("div1");
var nodeReplacement = elementReplacement.DomElement as mshtml.IHTMLDOMNode;
// The magic happens here!
nodeToReplace.replaceNode(nodeReplacement);
Eu duvido que isso vai melhorar performce como o processador de texto é rápido, e a memória consumida ainda será o mesmo se você tiver um grande página com div escondida do ou ter múltiplos div de memória em outros objetos?
Outras dicas
Você pode usar a biblioteca MSHTML (mshtml.dll) para alcançar este objectivo. Basicamente, você usaria uma única sobre:. Página em branco e, em seguida, dinamicamente escrever e conteúdo remover a partir dele
Veja este href="http://ryanfarley.com/blog/archive/2004/12/23/1330.aspx" rel="nofollow noreferrer"> blog
Você também pode escrever um wrapper interface personalizada que expõe a funcionalidade que você precisa de mshtml em vez de fazer referência a coisa toda (Quase 8MB) e é realmente fácil de fazer usando f12 em VS.
Você realmente precisa para removê-los enturely? Que tal deixar o seu "ramo" no DOM como o filho de um DIV cujo style = "display: none". Dessa forma, eles são objetos reais, DOM ao vivo, mas não visível.
Eu acho que você também pode usar o HtmlAgilityPack Ele permite que você para analisar uma vez, consultando a árvore HTML utilizando XPath ou via iterators e re-escrever a árvore com um método Save quando tiver terminado. Dependendo de sua estrutura, você pode simplesmente criar um adaptador em torno das aulas, porque ele só funciona em todo um documento HTML e deseja-lo em apenas elementos, mas isso não deve ser muito difícil.