使用递归函数解析XML时,如何从该函数返回字符串或数组?

时间:2019-06-22 14:02:39

标签: javascript xml recursion google-apps-script

我有一个有效的递归函数,该函数通过XML文档查找匹配的节点名称,然后记录匹配的值...我正在尝试对其进行修改以返回字符串或数组,并且可以没关系。

这是在Google Apps脚本中。我尝试将一个空白字符串传递到该函数中,然后在最后将其返回,但它不起作用。这是可用的Logger函数:

function logChildren(elements, dataRequired){

 for (var i = 0; i < elements.length; i++) {
  if (elements[i].getName() == dataRequired){
   Logger.log(elements[i].getText());
  }
  if(elements[i].getContentSize() > 1){
    var children = elements[i].getChildren();
    logChildren(children, dataRequired);
  }
 } 

};

我尝试传递一个空字符串,然后像这样返回它,但它不起作用:

function logChildren(elements, dataRequired, str){

 for (var i = 0; i < elements.length; i++) {
  if (elements[i].getName() == dataRequired){
   str = str + ", " + elements[i].getText();
  }
  if(elements[i].getContentSize() > 1){
    var children = elements[i].getChildren();
    logChildren(children, dataRequired, str);
  }
 } 

return str
};

如何获取此函数的字符串或数组OUT,而不仅仅是控制台记录它?

3 个答案:

答案 0 :(得分:0)

不返回str而不尝试它,因为str将具有所有值。如果返回str,则它可能会使当前迭代折叠。请让我们知道这是否有效

答案 1 :(得分:0)

提供您的元素已被解析且有效,这应该可以工作。

function logChildren(elements, dataRequired){
    values = [];
    req = elements.getElementsByTagName(dataRequired);
    for (var i = 0; i < req.length; i++) {
        values.push(req[i].childNodes[0].nodeValue);
    } 
    return values
};
elements = "<house>" + 
            "<name>hello</name>" +
            "<town>world</town>" +
            "<name>cat</name>" +
            "<folder>" +
                "<name>kitty</name>" +
            "</folder>" +
            "</house>";
p = new DOMParser();
elements = p.parseFromString(elements, "text/xml");
newValues = logChildren(elements, "name")
console.log(newValues);

我包含了我自己的小xml只是为了测试,它返回一个数组。

如您所见,getElementsByTagName甚至返回子文件夹中的值。

答案 2 :(得分:0)

您应该使用全局变量或其他函数,以使输出变量str在递归函数的范围之外。

var str = "";//holds all data of recursion
function logChildren(elements, dataRequired){
 ..
 str += ", " + elements[i].getText();
 ..
}