1

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

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

4

2 回答 2

3

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

这是您更新问题的答案。

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

您可以从评估函数返回以下类型的节点集:

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

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

迭代器

使用迭代器,您只能获得一种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);
}

请参阅一个工作示例

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

于 2010-06-27T04:14:40.947 回答
1

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

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

count(someExpression)

计算为 选择的节点数someExpression

于 2010-06-26T22:13:40.297 回答