我想使用MSHTML [1]来访问IE中的DOM,但我刚刚发现它缺少HTML文档类中的querySelector和querySelectorAll方法,否则将非常有助于通过CSS选择器获取文档中的元素
我现在能想到的唯一解决方法是通过执行脚本来完成所有操作,但这很糟糕。
是否有任何MSHTML版本具有这两种方法(querySelector和querySelectorAll)?是否有其他库(希望是Microsoft的官方.Net库),这两种方法或它们的等价物是否可用?
[1]%ProgramFiles(x86)%\ Microsoft.NET \ Primary Interop Assemblies \ Microsoft.mshtml.dll
答案 0 :(得分:7)
querySelector()方法和朋友们在MSHtml和IE DOM中都很活跃,问题在于大多数程序员在他们的机器上拥有的PIA已经过时了。在我的机器上注册的GAC上有一个7.0.3300.0版本号,可以追溯到2002年。
有一种解决方法,您可以生成自己的互操作库,并避免使用GAC中的互操作库。诀窍是通过创建没有强名称的互操作程序集来故意产生不匹配,因此它与GAC中的不匹配。请务必仅在VS2010或更高版本上执行此操作,您希望利用嵌入互操作类型功能。
启动Visual Studio命令提示符并导航到项目目录。并执行以下命令:
Tlbimp c:\windows\system32\mshtml.tlb
它会拖延一段时间,类型库很大,并吐出几个你可以忽略的看起来很警觉的警告。返回VS,删除现有的MSHTML引用并使用Add Reference,Browse选项卡。选择由Tlbimp生成的MSHTML.dll文件。
我无法保证完全没有问题,您需要记住,您的用户需要拥有最新版本的IE,最好是与您匹配的版本。如果您在IE的旧版本没有的接口上使用某个方法,那么它将会非常失败,可能会出现AccessViolationException。
答案 1 :(得分:0)
昨天我发现同样的问题,我找到了一个解决方案。
下一个示例代码适用于我:
Document.querySelectorAll("#navbar_search>a").item(0).click();
如果我尝试做同样的",但是使用此代码,它会失败:
HTMLDocument doc;
doc = ie.Document;
doc.querySelectorAll("#navbar_search>a").item(0).click();
我不是COM专家,但我认为第一个解决方案是后期绑定(依赖关系在运行时解决),而第二个解决方案是compliler-time绑定,它取决于&#39 ;好'预定义的库,而不是mshtml的情况。