确定此节点集的长度?

时间:2010-06-26 14:29:51

标签: 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();
    }

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

2 个答案:

答案 0 :(得分:3)

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

这是您更新的问题的答案。

  

现在我想弄清楚如何获得节点集的“长度”。我该怎么做?

您可以从evaluate函数返回以下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]);
}

快照

快照在查询时提供节点的静态结果。对文档的更改不会影响此快照。这里有用的接口是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文档提供了一个非常简单的界面 - 用于创建,操作和查询。

答案 1 :(得分:1)

  

现在我想弄清楚如何   获取节点集的“长度”。怎么样   我这样做了吗?

在XPath中,这是使用标准XPath count() 函数实现的。

count(someExpression)

评估someExpression选择的节点数。