Я не вижу никаких проблем в коде, который вы пока показали. Если childNodes[0]
не определено, то это должен быть текстовый узел или пустой узел, и вы должны увидеть исключение при попытке получить доступ к свойству, например nodeValue
из childNodes[0]
, которое не определено. Исключение будет отображаться при alert
или сцеплении, или любом другом типе доступа.
Это ответ на ваш обновленный вопрос.
Теперь я пытаюсь выяснить, как получить "длину" набора узлов. Как мне это сделать?
Вы можете иметь следующие типы наборов узлов , возвращаемых из функции оценки:
- итераторы
- 1020 * Снимки *
- Первые узлы
Я пропущу "первые узлы", так как это не применимо в этой ситуации.
итераторы
С итераторами вы получаете только метод 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-документами - для создания, манипулирования и запросов.