При синтаксическом анализе XML с помощью рекурсивной функции, как мне вернуть строку или массив из этой функции? - PullRequest
0 голосов
/ 22 июня 2019

У меня есть рабочая рекурсивная функция, которая просматривает 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 голосов
/ 22 июня 2019

Если ваши элементы уже проанализированы и действительны, это должно работать.

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 даже возвращает значения в subпапки.

0 голосов
/ 22 июня 2019

Вы должны использовать глобальную переменную или другую функцию, чтобы выходная переменная str выходила за рамки рекурсивной функции.

var str = "";//holds all data of recursion
function logChildren(elements, dataRequired){
 ..
 str += ", " + elements[i].getText();
 ..
}
0 голосов
/ 22 июня 2019

Вместо возврата str попробуйте без него, потому что str будет иметь все значения. Если вы вернете str, он может свернуть текущую итерацию. Пожалуйста, дайте нам знать, сработало ли это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...