我在让 XPath 返回任何内容时遇到问题。我只在 Firefox 中尝试过,但我使用了很多不同的示例,但没有一个能够正常工作。
function populateFilters(productType) {
callAjax.request({
url: './Products.xml',
onSuccess: function(rootNode, fullText) {
var path = '//product';
// code for IE
if (window.ActiveXObject)
var nodes=rootNode.selectNodes(path);
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
var nodes=rootNode.evaluate(path, rootNode, null, 0, null);
for (var i = 0; i < nodes.length; ++i) {
nodes[i].childNodes[0];
}
},
onError: function(errCode, responseStatus) {alert('An error has occured. Please contact the site\'s Webmaster.\n\n' + errCode + '\n' + responseStatus);}
});
}
ajax 调用工作正常...我正在获取 XML 文档并且能够毫无问题地导航 DOM。我遇到的问题是,当代码调用 rootNode.evaluate() 时,不会返回任何内容。没有错误,也没有数据。下面是 XML 的示例片段:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<product>
<type>Snowboard</type>
<brand>DC</brand>
</product>
<product>
<type>Skateboard</type>
<brand>Banana</brand>
</product>
<product>
<type>Clothing</type>
<brand>BoardDokter</brand>
</product>
</root>
我唯一能想到的是 var path = '//product';
不正确,但我看过很多示例,它确实应该有效。
大家有什么想法吗? Windows XP 和 Windows 7 上的 Firefox 4。
最佳答案
document.evaluate
返回 XPathResult
其有用方法取决于参数的对象:
- 无序 (
4
) 和有序 (5
) 迭代器为您提供一个带有iterateNext()
的对象,它返回每个节点,然后返回null
. - 无序 (
6
) 和有序 (7
) 快照为您提供一个带有snapshotLength
的对象和snapshotItem(index)
. - 如果您的 XPath 表达式返回节点,any (
0
) 将为您提供一个无序迭代器。
由于要评估的第四个参数是 0,因此它为您提供了一个无序迭代器,您必须调用 iterateNext()
在。这可能不是您想要的(大多数人想要有保证的订单)。
请参阅Mozilla documentation on document.evaluate
或W3C reference on document.evaluate
了解更多详情。
var xml = '<?xml version="1.0" encoding="ISO-8859-1"?>\n' +
'<root>\n' +
' <product>\n' +
' <type>Snowboard</type>\n' +
' <brand>DC</brand>\n' +
' </product>\n' +
' <product>\n' +
' <type>Skateboard</type>\n' +
' <brand>Banana</brand>\n' +
' </product>\n' +
' <product>\n' +
' <type>Clothing</type>\n' +
' <brand>BoardDokter</brand>\n' +
' </product>\n' +
'</root>';
var path = '//product';
var doc = (new DOMParser).parseFromString(xml, 'text/xml');
// choice 1: use iterator
var it = doc.evaluate(path, doc, null, 5, null);
var nodes1 = [];
var node;
while (node = it.iterateNext()) {nodes1.push(node);}
// choice 2: use snapshot
var snapshot = doc.evaluate(path, doc, null, 7, null);
var nodes2 = [];
for (var i = 0; i < snapshot.snapshotLength; i++) {
nodes2.push(snapshot.snapshotItem(i));
}
实用提示:输入 $x
进入 Chrome 中的 Javascript 控制台,查看将 XPath 转换为 Javascript 数组的函数的源代码。
关于javascript - XPath .evaluate() 不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587835/