2014-01-16 36 views
3

我想使用MSHTML [1]访问IE中的DOM,但我刚刚发现它缺少HTML文档类中的querySelector和querySelectorAll方法,否则这对于通过CSS选择器获取文档中的元素非常有帮助。为什么.Net的MSHTML没有querySelector和querySelectorAll,或者它们在哪里?

我现在可以想到的唯一解决方法是通过执行脚本来完成所有任务,但这很糟糕。

是否有任何MSHTML版本具有两种方法(querySelector和querySelectorAll)?有没有其他的库(希望,微软的官方.Net库)可以使用这两种方法或它们的等价物?

[1]的%ProgramFiles(x86)的%\ Microsoft.NET \主互操作程序集\ Microsoft.mshtml.dll

回答

6

的querySelector()方法和朋友是生命力,在MSHTML和IE DOM,所述问题在于大多数程序员在他们的机器上拥有的PIA严重过时。在我的机器上在GAC中注册的版本号携带7.0.3300.0版本号,可以追溯到2002年。

有一种解决方法,您可以生成自己的互操作库并避免在GAC中使用该库。窍门是通过创建没有强名称的互操作程序集来故意生成不匹配,因此无法与GAC中的匹配。请务必只在VS2010或更高版本上执行此操作,您想利用Embed Interop Types功能。

启动Visual Studio命令提示符并导航到您的项目目录。并执行以下命令:

Tlbimp c:\windows\system32\mshtml.tlb 

它将曲折行进了一段时间,类型库大,吐出几个恶心找警告,可以忽略。回到VS,删除现有的MSHTML参考并使用添加引用,浏览选项卡。选择由Tlbimp生成的MSHTML.dll文件。

我不能保证没有任何问题,你需要记住你的用户需要有一个最新版本的IE,最好是与你匹配的IE版本。如果你在一个老版本的IE没有的接口上使用方法,那么它将会非常快速地失败,可能会出现AccessViolationException。

0

昨天我注意到同样的问题,我找到了解决方案。

下一个示例代码工作对我来说:

Document.querySelectorAll("#navbar_search>a").item(0).click(); 

如果我尝试做“相同的”,但与此代码,它失败:

HTMLDocument doc; 
doc = ie.Document; 
doc.querySelectorAll("#navbar_search>a").item(0).click(); 

我不是一个COM专家,但我的第一个解决方案是后期绑定(依赖性在运行时解决),而第二个解决方案是一个compliler时间绑定,它取决于一个'好'预定义的库,这不是mshtml的情况。

相关问题