javascript - XPath .evaluate() 不返回任何内容

标签 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。

最佳答案

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/

相关文章:

javascript - 如何一键检查特定表格内的所有复选框

javascript - 如何固定箭头的位置不依赖于 Jquery 工具提示中的内容?

java - 在android中读取xml的最佳方式是什么?

python - 如何使用 Python 解析复杂的 XML

java - 如何获取java x路径中带有命名空间的嵌套xml的属性

xml - XPath查询不匹配任何值

java - 获取xsi的值:noNamespaceSchemaLocation (XPATH)

javascript - typescript 2 + Angular googlemaps typescript 定义

javascript - PhoneGap (Cordova) 应用程序在加载谷歌图表 API 时崩溃

java - 包R错误