XPath .evaluate()没有返回任何内容

时间:2011-04-07 21:24:19

标签: javascript xml xpath

我遇到了让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。

1 个答案:

答案 0 :(得分:3)

document.evaluate返回一个XPathResult对象,其有用的方法取决于参数:

  • 无序(4)和有序(5)迭代器为您提供一个iterateNext()的对象,该对象返回每个节点,然后返回null
  • 无序(6)和有序(7)快照为您提供了snapshotLengthsnapshotItem(index)的对象。
  • 如果你的XPath表达式返回节点,任何(0)将给你一个无序的迭代器。

由于要计算的第四个参数为0,因此它为您提供了一个无序的迭代器,您必须在其上调用iterateNext()。这可能不是你想要的(大多数人想要保证订单)。

有关详细信息,请参阅Mozilla documentation on document.evaluateW3C 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数组。