javascript - 确定这个节点集的长度?

标签 javascript firefox xpath evaluate

Mozilla 的 JavaScript:

  while (result)
    {
    alert(result.childNodes[0].nodeValue);
    //txt=txt+result.childNodes[0].nodeValue+"<br/>";
    result=nodes.iterateNext();
    }

这旨在从 xml 文件返回一系列字符串。当我使用警报行时,它会按预期使用一系列正确的字符串发出警报。注释行上的“txt”变量应该转到函数中更下方的innerHTML。但 Firebug 一直告诉我 result.childNodes[0] 未定义。为什么它会在警报中定义而不是在下一行中定义?

我希望有足够的代码来确定问题...如果没有,我会发布更多内容。

感谢帮助

[编辑]

这是结果的定义:

  var x=xmlDoc.responseXML;
  var nodes=x.evaluate(path, x, null, XPathResult.ANY_TYPE, null);
  var result=nodes.iterateNext();

我正在检索 XML

[编辑]

好吧,我将迭代器放入 for 循环中,如下所示:

  for (var i=0; i<2; i++)
    {
    var res=(xmlNodes.childNodes[0].nodeValue);
    txt=txt+res+"<br/>";
    xmlNodes=xmlQuery.iterateNext();
    }

因为我有一个理论,一旦迭代为空,循环就会失败。这就是发生的事情 - 它一直有效,直到我将循环一个实例设置为高于可用节点的数量。现在我想弄清楚如何获取节点集的“长度”。我该怎么做?

最佳答案

到目前为止,我在您显示的代码中没有发现任何问题。如果 childNodes[0] 未定义,则它必须是文本节点或空节点,并且在尝试访问诸如 nodeValue 之类的属性时,您应该会看到异常未定义的 childNodes[0] 。异常将显示在警报或串联或任何其他类型的访问中。

这是您更新问题的答案。

now I am trying to figure out how to get the "length" of the node-set. How do I do that?

您可以拥有以下 types of node-sets从评估函数返回:

  • 迭代器
  • 快照
  • 第一个节点

我将跳过“第一个节点”,因为这在这种情况下不适用。

迭代器

使用迭代器,您只能获得一个用于顺序遍历节点的iterateNext()方法。迭代器引用事件节点,这意味着如果在遍历结果集时文档中的节点发生更改,迭代器将变得无效。

这是一个使用迭代器遍历每个结果节点的示例:

var results = doc.evaluate("expr", doc, null, ORDERED_SNAPSHOT, null);
var node;

while(node = results.iterateNext()) {
    console.log(node);
}

如果您想使用迭代器并查找匹配结果的数量,则迭代所有节点并在数组中返回它们的包装函数可能会很有用。

function evaluateXPath(document, expression) {
    var ANY_TYPE = XPathResult.ANY_TYPE;
    var nodes = document.evaluate(expression, document, null, ANY_TYPE, null);
    var results = [], node;

    while(node = nodes.iterateNext()) {
        results.push(node);
    }

    return results;
}

获取节点作为数组并循环该数组:

var results = evaluateXPath(doc, "expr");

for(var i = 0; i < results.length; i++) {
    console.log(results[i]);
}

快照

快照提供查询时节点的静态结果。对文档的更改不会影响此快照。这里有用的接口(interface)是 snapshotLength 属性和 snapshotItem(index) 函数。

以下是使用快照结果的示例:

var ORDERED_SNAPSHOT = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE;
var results = doc.evaluate("expr", doc, null, ORDERED_SNAPSHOT, null);

for(var i = 0; i < results.snapshotLength; i++) {
    var node = results.snapshotItem(i);
    console.log(node);
}

查看working example .

看来您正在为 Firefox 开发此程序。您是否考虑过使用 E4X以此目的?它提供了一个非常简单的界面来处理 XML 文档 - 用于创建、操作和查询。

关于javascript - 确定这个节点集的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3124208/

相关文章:

javascript - 如果直接在 Redux reducer 中修改状态会发生什么?

javascript - 如何让firefox扩展在指定域上运行js

python - WebDriver异常 : Message: newSession with GeckoDriver Firefox v65 and Selenium through Python 3. 7

javascript - 在模态中填充内容,当单击 <a> 标签时,不会触发单击事件

javascript - Typeahead 和 Bloodhound 动态改变局部值

javascript - 随机化 setInterval 以在随机时间显示随机图像

javascript - Firefox:禁用退出警告框?

XSLT 非法属性 'separator'

Ruby selenium webdriver 查找特定的 svg 元素

python - 如何使用 XPath 从 imdb.com 网站抓取新电影数据?