Определить длину этого набора узлов? - PullRequest
1 голос
/ 26 июня 2010

Javascript для Mozilla:

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

потому что у меня была теория, что как только итерация будет нулевой, цикл потерпит неудачу. Так вот что получилось - это работало, пока я не установил цикл на один экземпляр больше, чем количество доступных узлов. Теперь я пытаюсь выяснить, как получить «длину» набора узлов. Как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 27 июня 2010

Я не вижу никаких проблем в коде, который вы пока показали. Если 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-документами - для создания, манипулирования и запросов.

1 голос
/ 27 июня 2010

сейчас я пытаюсь понять, как получить "длину" набора узлов. Как я делаю это?

В XPath это достигается с помощью стандартной функции XPath count().

count(someExpression)

оценивает количество узлов, выбранных someExpression.

...