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

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

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

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

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

querySelector()方法和朋友们在MSHtml和IE DOM中都很活跃,问题在于大多数程序员在他们的机器上拥有的PIA已经过时了。 在我的机器上注册的GAC中有一个版本号为7.0.3300.0,可以追溯到2002年。

有一种解决方法,您可以生成自己的互操作库,避免使用GAC中的互操作库。 诀窍是通过创建没有强名称的互操作程序集故意产生不匹配,因此它与GAC中的不匹配。 请务必仅在VS2010或更高版本上执行此操作,您希望利用嵌入互操作类型function。

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

Tlbimp c:\windows\system32\mshtml.tlb 

它会拖延一段时间,类型库很大,并吐出几个你可以忽略的看起来很警觉的警告。 返回VS,删除现有的MSHTML引用并使用Add Reference,Browse选项卡。 选择由Tlbimp生成的MSHTML.dll文件。

我无法保证完全没有问题,您需要记住,您的用户需要拥有最新版本的IE,最好是与您的版本相匹配的版本。 如果您在IE的旧版本没有的接口上使用某个方法,那么它将很快失败,可能会出现AccessViolationException。

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

Next示例代码适用于我:

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

如果我尝试“相同”,但使用此代码,它会失败:

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

我不是COM专家,但我认为第一个解决方案是后期绑定(依赖关系在运行时解决),而第二个解决方案是compliler-time绑定,它取决于’良好’的预定义库,而不是用mshtml的情况。