我正在开发一个使用XPath表达式从XML中选择节点的应用程序。我们已经注意到,在Microsoft Edge预览中进行测试时,我们似乎已经崩溃了。我已经将代码缩减为一个简短的代码片段,演示了这个问题:
var xml = "<xml id='relationships'><Relationships><f id='some_id' ><f id='some_other_id' /></f></Relationships></xml>";
var doc = (new DOMParser).parseFromString(xml, "text/xml");
var nodes = doc.evaluate("//f[@id='some_id' and f]", doc, doc.createNSResolver(doc.documentElement), XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
console.log(nodes.snapshotLength);
在Chrome中,这将注销1
,nodes.snapshotItem
将包含正确的节点,但在Edge中,它会注销0
并且不返回任何节点。
如果我分别运行此条件的一半,"//f[@id='some_id']"
或"//f[f]"
,它会在浏览器中一致地运行,而Edge会返回正确的节点。只有当这两个条件(对于所讨论的节点都是真的)与and
组合时,它才会失败。我不是任何一个XPath专家,所以任何人都可以告诉我,如果我在这个片段中做任何非标准的事情,或者这看起来像是Edge预览的XPath实现的问题吗?
答案 0 :(得分:3)
更新:此问题已在2015年11月更新到Windows / Edge
中得到解决这似乎是Microsoft Edge中当前实现的错误。然而,我确实注意到,如果你翻转条件,就会检索到正确的元素:
//f[f and @id='some_id']
目前,我希望这是一个可以接受的选择。我正在为我们的团队开辟一个错误,让我们在最后审核。比你帮助我们改进Microsoft Edge:)
答案 1 :(得分:3)
在Edge中失败的XPath后跟类似的替代方法:
故障
'/value[Name/text()="Checked"]/Value[text()="true"]'
替代
'/value[Name ="Checked" and Value = "true"]/Value'
故障
'/value[text()="match1"]'
替代
'/value[.="match1"]'
故障
'/value[Name[text()="match1"]]'
替代
'/value[Name="match1"]'
故障
'/value[Name/text()= "match1"]'
替代
'/value[Name= "match1"]'
故障
'/value[Name[text() = 'match1']]')
替代
'/value[Name = "match1"]')