C#WPF Webbrowser msHTML - 探索DOM - 查找元素

时间:2017-07-05 06:42:48

标签: c# wpf dom browser mshtml

我实际上正在使用WPF和WPF WebBrowser在C#中开展个人项目。我真的需要像以前在javascript或php..etc中那样探索html DOM Elements

在我的MainWindow中,我有这个变量:

private mshtml.HTMLDocument mainDocument = new mshtml.HTMLDocument();

在我的webBrowser LoadComplete回调中,我有这个:

mainDocument = (mshtml.HTMLDocument) mainBrowser.Document;

好的,所以这很好,它正在发挥作用。

现在,如果我这样做:

mshtml.IHTMLElement elem = mainDocument.getElementById("MY_ID");

它也很好,可以做elem.innerHTML或类似的东西。

但我的问题是只有HTMLDocument有方法可以通过ID,通过标记名来找到元素..等等

我不知道如何在IHTMLElement中找到元素。我尝试了一些东西,比如将IHTMLElement转换为IHTMLElement2..etc,但没有任何效果。

如果您有任何想法,请。很多人谈到托管winforms webbrowser,但我认为它必须有办法只用mshtml做到这一点。

非常感谢, 如果您需要更多信息,请随时问我

ps:我是法国人,所以我对我的英语技能感到抱歉

2 个答案:

答案 0 :(得分:0)

如果要在Winforms或wpf中解析HTML文档,可以使用优秀的解析器htmlagility包。请参阅以下链接 http://html-agility-pack.net

  var url = "http://html-agility-pack.net/";
 var web = new HtmlWeb();
 var doc = web.Load(url);

在doc中加载后,您可以获取任何属性,标记等。

 var value = doc.DocumentNode
.SelectNodes("//td/input")
.First()
.Attributes["value"].Value;

这非常简单,只需稍微探索一下文档,就可以充分利用它。

您甚至可以从webbrowser加载html敏捷包,如下所示

HtmlAgilityPack.HtmlDocument doc = new 
HtmlAgilityPack.HtmlDocument();
            doc.Load(webBrowser1.DocumentStream);

或者你可以这样做

HtmlAgilityPack.HtmlDocument doc = new 
HtmlAgilityPack.HtmlDocument();
            doc.Load(webBrowser1.Document);

由于

答案 1 :(得分:0)

非常感谢@Sujit的帮助。 我没有说出你的答案是有帮助的声誉,但我希望其他人也会这样做。

为了使用wpf webbrowser,我已经完成了:

mainHTMLDoc.LoadHtml((mainBrowser.Document as mshtml.HTMLDocument).documentElement.innerHTML);

操纵一切应该使用:

using System.Linq;

之后你可以做那样的事情:

var table = mainHTMLDoc.GetElementbyId("MyID");
var rows = table.Element("tbody").Elements("tr");
for(int i=0; i< rows.Count();i++) {
    var datacol1 = rows.ElementAt(i).Elements("td").ElementAt(0).Descendants("a").ElementAt(0).InnerHtml;
    var datacol2 = rows.ElementAt(i).Elements("td").ElementAt(1).InnerText 
}

使用Linq的Whitout你不能使用非常有用的Elements功能! 再次感谢Sujit:)