我遇到了让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。
答案 0 :(得分:3)
document.evaluate
返回一个XPathResult
对象,其有用的方法取决于参数:
4
)和有序(5
)迭代器为您提供一个iterateNext()
的对象,该对象返回每个节点,然后返回null
。6
)和有序(7
)快照为您提供了snapshotLength
和snapshotItem(index)
的对象。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));
}
方便提示:在Chrome中的Javascript控制台中输入$x
,查看其功能来源,将XPath转换为Javascript数组。