0

仕事で使用するプログラムがあり、そのデータを XML ファイル (いくつか) に出力します。これらのファイルを読み取ってデータを処理するための HTA (はい、HTA です。申し訳ありません) を開発しようとしています。残念ながら、多数の XML ファイルがあり、いくつかの特定のファイルのみを読み取る必要があるため、一般的な「XML から配列へ」関数を記述しようとしています。

XMLファイルを読み取るようになりましたが、ファイルを2次元配列に処理したいと考えています。ただし、再帰関数を使用しているため、データが失われているようです。関数は次のとおりです。

NodesToArray = function (xmlDOC){

    //Must redeclare "i" with each recursion, or it won't work correctly. ie: for(VAR i = 0...  
    for(var i = 0; i < xmlDOC.length ; i++){

        //Just because it has a child still do the check.
        if(xmlDOC[i].childNodes.length > 1){

             //Recursively run the function.
             var ReturnArray = NodesToArray(xmlDOC[i].childNodes);
             //alert(ReturnArray + " " );   

             if(ReturnArray) return ReturnArray;

     }else{

    //Check to see if the node has a child node, if not and a child node is called, it will error out and stop
    if(xmlDOC[i].hasChildNodes() == true){

        return xmlDOC[i].firstChild.nodeValue;

         }
       }    
     }  
   } 

最初の子の値を返す場所にアラートを設定し、必要なすべてのデータを表示できました。もちろん、セットアップすると、データが保持されていないことがわかりました。私はたくさんの読書をしましたが、机に頭をぶつけていますが、まだ何も思いつきません.

私はグーグルで検索し、このサイトを検索し、多くのフォーラムに相談しましたが、私にとってうまくいくものは何も見つかりません. 私は行き止まりにあるので、しぶしぶここに投稿します。ご協力いただきありがとうございます。可能な限り追加情報を提供します。

ただのメモですが、ライブラリ(具体的にはjQuery)なしでこれを実行できるようにしたいと考えています。HTA は、新しい Javascript の多くをサポートしていないようです。私は決してプロのコーダーではなく、すべてをゼロから行うことで学習します。

解決策の設定方法がわからないが、見つけた

function NodesToArray(xmlDOC, returnArray){
    for(var i = 0; i < xmlDOC.length ; i++){
        if(xmlDOC[i].childNodes.length > 1){
            returnArray[returnArray.length] = NodesToArray(xmlDOC[i].childNodes, []);
        }else{
            if(xmlDOC[i].hasChildNodes() == true){      
                returnArray[returnArray.length] = (xmlDOC[i].firstChild.nodeValue);
            }
        }
    }
    return returnArray;
}

getArray = NodesToArray(getXML.getElementsByTagName(tagName)[0].childNodes,[]);

助けてくれてありがとう!

4

2 に答える 2

1

同じコンテナーでデータを再帰的に取得する一般的な方法は、次の 2 つの関数を記述することです。

  1. 最初のものはあなたが呼び出して配列を返すものです
  2. 2 つ目は最初の関数によって呼び出され、再帰を実行します。データを同じ配列に配置できるようにするには、関数がパラメーターとして受け取る必要があります。

ここにいくつかの擬似コードがあります

getData(node) {
   _2D_array = new array[][];
   getData(node, _2D_array, 0);
   return array;
}

getData(node, _2D_array, depth) {
   if(node) { // end of recursion ?
       _2D_array[depth].add(...); // populate from node
       getData(node.next, _2D_array, depth++);
   }
}
于 2013-04-16T12:35:09.483 に答える
0

関数が戻るため、最初の要素が処理されると、プログラムは終了します。関数は一度だけ戻ることができます。ループが完了するように、return ステートメントをループの外に移動する必要があります。

于 2013-04-16T12:34:18.213 に答える