为什么MSHTML for .Net没有querySelector和querySelectorAll,或者它们在哪里?

时间:2014-01-16 16:03:52

标签: c# .net microsoft.mshtml

我想使用MSHTML [1]来访问IE中的DOM,但我刚刚发现它缺少HTML文档类中的querySelector和querySelectorAll方法,否则将非常有助于通过CSS选择器获取文档中的元素

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

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

[1]%ProgramFiles(x86)%\ Microsoft.NET \ Primary Interop Assemblies \ Microsoft.mshtml.dll

2 个答案:

答案 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的情况。