我能找到的唯一解决方案是:
mshtml.HTMLDocument htmldocu = new mshtml.HTMLDocument();
htmldocu .createDocumentFromUrl(url, "");
并且我不确定性能,它应该比在WebBrowser中加载html文件然后从那里获取HtmlDocument更好。无论如何,该代码在我的机器上不起作用。应用程序在尝试执行第二行时崩溃。
有没有人有办法有效地或以任何其他方式实现这一目标?
注意:请理解我需要HtmlDocument对象进行DOM处理。我不需要html字符串。
答案 0 :(得分:1)
使用DownloadString
对象的WebClient
方法。 e.g。
WebClient client = new WebClient();
string reply = client.DownloadString("http://www.google.com");
在上面的示例中,执行后,reply
将包含端点http://www.google.com
的html标记。
答案 1 :(得分:0)
为了尝试回答四年前的实际问题(在我发布此答案时),我正在提供一个有效的解决方案。如果你找到另一种方法,我也不会感到惊讶,所以这主要是为了寻找类似解决方案的其他人。但请记住,这被认为是
HtmlDocument
)此外,请记住,HtmlDocument
实际上只是mshtml.HTMLDocument2
的包装器,因此技术上比直接使用COM包装器慢,但我完全理解用例只是为了便于编码。
如果您对以上所有内容感到满意,那么就是如何实现您想要的目标。
public class HtmlDocumentFactory
{
private static Type htmlDocType = typeof(System.Windows.Forms.HtmlDocument);
private static Type htmlShimManagerType = null;
private static object htmlShimSingleton = null;
private static ConstructorInfo docCtor = null;
public static HtmlDocument Create()
{
if (htmlShimManagerType == null)
{
// get a type reference to HtmlShimManager
htmlShimManagerType = htmlDocType.Assembly.GetType(
"System.Windows.Forms.HtmlShimManager"
);
// locate the necessary private constructor for HtmlShimManager
var shimCtor = htmlShimManagerType.GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[0], null
);
// create a new HtmlShimManager object and keep it for the rest of the
// assembly instance
htmlShimSingleton = shimCtor.Invoke(null);
}
if (docCtor == null)
{
// get the only constructor for HtmlDocument (which is marked as private)
docCtor = htmlDocType.GetConstructors(
BindingFlags.NonPublic | BindingFlags.Instance
)[0];
}
// create an instance of mshtml.HTMLDocument2 (in the form of
// IHTMLDocument2 using HTMLDocument2's class ID)
object htmlDoc2Inst = Activator.CreateInstance(Type.GetTypeFromCLSID(
new Guid("25336920-03F9-11CF-8FD0-00AA00686F13")
));
var argValues = new object[] { htmlShimSingleton, htmlDoc2Inst };
// create a new HtmlDocument without involving WebBrowser
return (HtmlDocument)docCtor.Invoke(argValues);
}
}
使用它:
var htmlDoc = HtmlDocumentFactory.Create();
htmlDoc.Write("<html><body><div>Hello, world!</body></div></html>");
Console.WriteLine(htmlDoc.Body.InnerText);
// output:
// Hello, world!
我没有直接测试此代码 - 我已经从旧的Powershell脚本翻译了它,它需要您要求的相同功能。如果失败,请告诉我。功能就在那里,但代码可能需要非常小的调整才能正常工作。