0

我有一个我们在工作中使用的程序,它将其数据输出到 XML 文件(其中几个)。我正在尝试开发一个 HTA(是的 HTA,我很抱歉)来读取这些文件并处理它们的数据。不幸的是,有许多 XML 文件,我只需要阅读一些特定的文件,所以我正在尝试编写一个通用的“XML 到数组”函数。

我得到它来读取 XML 文件,现在我想将文件处理成二维数组。但是,由于我使用的是递归函数,我似乎丢失了数据。这是功能:

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

在同一个容器中递归检索数据的一般方法是编写两个函数:

  1. 第一个是您调用并返回数组的那个
  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 回答