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/