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,循环就会失败。这就是发生了什么 - 它一直有效,直到我将循环设置为高于可用节点数量的一个实例。现在我想弄清楚如何获得节点集的“长度”。我该怎么做?
答案 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);
}
好像你正在为Firefox开发这个。您是否考虑过将E4X用于此目的?它为处理XML文档提供了一个非常简单的界面 - 用于创建,操作和查询。
答案 1 :(得分:1)
现在我想弄清楚如何 获取节点集的“长度”。怎么样 我这样做了吗?
在XPath中,这是使用标准XPath count()
函数实现的。
count(someExpression)
评估someExpression
选择的节点数。