Frage

Ich bin mit der MSIE WebBrowser Steuerung in einer Desktop-Anwendung C # und bin auf der Suche nach einem Weg, Bäume von HtmlElement Objekten außerhalb dieser Steuerung aufzubauen und zu pflegen. Ich versuche, zwischen mehreren komplexen Seiten zu schnell wechseln, ohne den Aufwand der Wieder Parsen entsteht die HTML jede Zeit (und ich will nicht mehr Kontrollen aufrechtzuerhalten, die ein- / ausgeblendet werden je nach Bedarf). Ich entdeckte, dass a) ich nur HtmlElement Objekte über die Kontrolle des HtmlDocument schaffen kann und b) wenn ich einen „Stamm“ von HtmlElement Objekte aus der HtmlDocument Kontrolle entfernen, es „abstirbt“, obwohl ich an der Wurzel eine starke Referenz halten Aufrechterhaltung Element. Wie kann ich das tun?

P. S. Ich bin bereit, alternative Browser Kontrollen zu prüfen (z Gecko), wenn sie mir erlauben, die oben zu erreichen.

War es hilfreich?

Lösung

Dies wird es tun

// 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);

Ich bezweifle dies performce verbessern wird als die Text-Renderer schnell ist, und der verbrauchte Speicher wird immer noch die gleiche sein, wenn Sie eine große Seite mit versteckten divs haben oder im Speicher mehr divs in anderen Objekten?

Andere Tipps

Sie können die MSHTML-Bibliothek (Mshtml.dll), dies zu erreichen. Grundsätzlich würden Sie eine einzelne über benutzen. Leere Seite und dann dynamisch schreiben, und entfernen Sie Inhalte aus it

Sehen Sie diese Blogeintrag rel="nofollow

Sie können auch eine benutzerdefinierte Schnittstelle Wrapper schreiben, die die Funktionalität, die Sie von mshtml brauchen aussetzt, anstatt die ganze Sache Referenzierung (fast 8 MB), und es ist wirklich einfach mit f12 in VS zu tun.

Haben Sie wirklich brauchen sie enturely entfernen? Wie wäre es Ihre „Zweig“ im DOM als das Kind eines DIV dessen style = verlassen „display: none“. So können sie echt sind, leben DOM-Objekte, aber nicht sichtbar.

Ich glaube, Sie auch die htmlagilitypack Es ermöglicht Ihnen, einmal zu analysieren, den HTML-Baum Abfrage mit XPath oder über Iteratoren und Umschreiben des Baum mit einer Methode speichern, wenn Sie fertig. Je nach Ihrer Struktur könnte man nur einen Adapter erstellen um die Klassen, weil es funktioniert nur auf einem gesamten HTML-Dokument und Sie wollen es auf Elemente nur, aber dies sollte nicht zu hart sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top