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

反復がnullになるとループが失敗するという理論があったからです。それが起こったことです-ループを使用可能なノードの量よりも 1 つのインスタンスを高く設定するまでは機能していました。今、ノードセットの「長さ」を取得する方法を見つけようとしています。それ、どうやったら出来るの?

4

2 に答える 2

3

これまでに示したコードに問題はありません。が未定義の場合childNodes[0]、それはテキスト ノードまたは空のノードである必要があり、未定義nodeValueのようなプロパティにアクセスしようとすると例外が発生するはずchildNodes[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

now I am trying to figure out how to get the "length" of the node-set. How do I do that?

In XPath this is achieved using the standard XPath count() function.

count(someExpression)

evaluates to the number of nodes selected by someExpression.

于 2010-06-26T22:13:40.297 に答える