DOM操作についての質問です。

とあるObjectツリーのnodeNameが"#text"のみを拾って、配列で返却するようなJavaScriptはどのように記述すれば良いでしょうか?
内部処理はリカーシブルなものが良いです。
また、もし可能であればhasChildNodes()やnextSiblingによるDOM操作(配列ではなく)だと、コツが理解できそうなのでうれしいです。

回答の条件
  • URL必須
  • 1人1回まで
  • 登録:2008/02/20 21:42:38
  • 終了:2008/02/27 21:45:02

回答(1件)

id:wasisan No.1

wasisan回答回数86ベストアンサー獲得回数72008/02/22 11:31:22

ポイント60pt
var tree2array = function(xml_file) {
  // 初期化
  xml_doc = new ActiveXObject("Microsoft.XMLDOM");
  xml_doc.async = false;
  xml_doc.load(xml_file);


  // stackリストに集める再帰処理関数
  var stack = [];
  var iter = function(root) {
    if (!root.hasChildNodes()) {
      return;
    } else {
      var lst = root.childNodes;
      for (var i=0; i<lst.length; i++) {
        if (lst[i].nodeName == "#text") {
          stack.push(lst[i].text);
        }
        iter(lst[i]); // 再帰
      }
    }
  }

  // 本体
  iter(xml_doc.documentElement);
  return stack;
}

var res = tree2array("foo.xml");
WScript.echo(res);

となります.一番簡単なスタックに集めるパターンです.

とても簡単な処理のはずでしたが,少しはまりました.

付録2.1 JavaScript var宣言は大事

にもあるとおりのことです.

グローバルになってしまうので,変数には必ずvarをつけましょう.

変数iにvarをつけなかったのでえらい手間取ってしまいました.

  • id:P-mako
    返信が遅くなり申し訳ありません。
    #返信が遅すぎて、書いている間に自動終了してしまいました。

    対象となるソースがXMLではなくHTMLだったからなのか、
    stack.push(lst[i].text);

    stack.push(lst[i].nodeValue);
    で、思い通りの処理になりました。
    ありがとうございました!

この質問への反応(ブックマークコメント)

トラックバック

  • Mars Diary 2008-02-21 10:00:47
    question:1203511355 こちらを見て試しにスクリプトを書いた。(後から気付いたけど回答権なしでしたが(笑)) で、思ったのがIE以外で取得できる要素間のレンダリングされないテキストノード
  • DOM上の改行ノード question:1203511355 こちらを見て試しにスクリプトを書いた。(後から気付いたけど回答権なしでしたが(笑)) で、思ったのがIE以外で取得できる要素間のレンダリングされな
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません