在Internet Explorer中使用DOM Level 3 XPath

32

我刚刚在Windows 7上安装了IE10,我注意到即使我很高兴AJAX请求的XML现在可以作为兼容的DOM文档,但是像document.evaluate这样基本的函数仍然不支持。

更糟糕的是,由于那些XML不是定制的Microsoft IXMLDocument对象,节点不再支持selectNodesselectSingleNode最终,似乎IE10不支持DOM Level 3 XPath或MSXML Xpath。

微软,你认真的吗?我有什么遗漏了吗?

当然,我可以使用querySelectorquerySelectorAll,但我不想失去相当多的向后兼容性。

否则,你仍可以使用这行代码请求MSXML文档

try {xhr.responseType = "msxml-document";} catch(e) {}

这里所述,不过我认为在IE中处理标准DOM文档也是个好主意。

所以,在IE10中是否有一种使用XPath和标准DOM文档的方法呢?

更新26/7/2013:IE11尚未稳定,但仍不支持document.evaluate。如果在稳定版中也不支持它,那我觉得它永远也不会支持了。毫无疑问,这是荒谬的。

我知道你可以在DOM节点中使用querySelector/All,但它不支持IE9及以下版本,而这些版本仍然广泛使用,此外XPath比选择器更强大。

幸运的是(如果你这么说),你仍然可以设置xhr.responseType = "msxml-document"。一度让我担忧的是,你再也不能这么做了......

更新23/11/2013:IE11现在已经稳定,但遗憾的是它仍不支持document.evaluate。随着重量级XML文档在Web应用程序中越来越少被使用,而更多地使用JSON或其他轻量级标记语言格式,这已经变得不再是问题了,但仍然存在。

设置responseType属性仍然提供了遗留的XML文档,所以我想没有什么损失。不过我不知道在IE12中是否仍然如此。

更新15/8/2015:听起来现在有点荒谬,但Edge现在支持document.evaluate。就在(几乎)所有数据交换都转换到JSON之后。不过,迟到总比不到好,我想。


8
哇!刚刚在谷歌上搜索了一下,你可能有所发现。这将成为IE不应被使用的9678个理由之一! - Rob
querySelector/All支持CSS选择器语言。XPath是一种(更强大的)语言,用于选择/分析*ML文档中的节点。本文的重点是质疑是否存在一种适用于XML文档的跨浏览器选择器语言。 - MaxArt
我知道querySelector/All和XPath是什么。我只是在提到你帖子中的声明“但它不支持IE9及以下版本”。这是不正确的。应该是“IE8及以下版本”。我并不是说这对于这个问题或你的答案有任何实质性的区别。 - user663031
@torazaburo querySelector也被IE8支持,但不适用于XML节点。IE10是第一个将XML作为标准DOM文档处理的IE版本。 - MaxArt
1
感谢定期更新此问题的状态! - anton.burger
显示剩余2条评论
2个回答

15

是的,在IE中仍然没有XPath支持 =/。

对我来说,在所有浏览器中最可靠的使用document.evaluate的方法,很遗憾,是通过一个库。

它叫做Wicked Good XPath,这是Google最近重新编写的一款优秀的JavaScript-XPath库。自发布以来,我一直在使用Wicked Good XPath,并且非常满意(虽然不像本地XPath支持那样舒适,但还是很好用的)。


1
仍然?在这个问题中,听起来好像之前有XPath支持,但现在已经停止了。 - O. R. Mapper
据我所知,IE的任何版本都不支持document.evaluate(或任何其他XPath选择DOM文档)。 - Petr Janeček
3
@Slanec 确实如此,但你从IE9之前的AJAX请求中获得的XML是MSXML文档,该文档具有 .selectNodes.selectSingleNode 这些方便的节点方法,你可以在部分场景下使用它们替代 document.evaluate。自IE10以后,默认响应文档不再是MSXML文档,因此这些方法已经不存在了。无论如何,你的回答听起来很不错,如果在几天内没有更好的答案出现,我将接受它。 - MaxArt
试试这个网站:http://llamalab.com/js/xpath/。他们有一个15k版本的压缩文件和一个演示页面,可以测试他们的脚本。效果很好。 - PHPGuru

5

这是Microsoft Edge 10240+版本的一部分:modern.ie:DOM Level 3 XPath

IE Dev Channel有一个可以用来预览它的版本:

它在内部使用

为了支持WGX而不污染Web页面的上下文,我们创建了一个单独、隔离的脚本引擎专门用于WGX。通过对提供调用函数和访问结果的入口点进行一些修改,我们将数据从页面传递到隔离引擎,并使用WGX评估表达式。启用WGX处理本机XPath查询后,我们看到很多网站在我们的新引擎中呈现现代Web时缺少内容,因此看到了立竿见影的收益。
目前,MSDN提供了迁移指南,建议如下:
一般情况下,请尝试迁移到本机对象和API,除非需要XPath/XSLT等功能;这可以通过将responseText传递给DOMParser来完成,而不是使用responseXML变量。
如果仍需要MSXML API,则可以更新特性检查以验证接收到的节点类型,以选择正确的API。
参考资料

哇,就在我失去希望的时候。而它的实用性每天都在降低。 - MaxArt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接