RangeError в libxmljs в NodeJS

Я пытаюсь заменить длинные теги XML значениями int. Пример '' как '‹1>', поэтому каждый тег с именем 'child' во всем файле XML будет заменен на '1'. Для этого я использую libxmljs в NodeJS. Пока мой код ;

    var libxml = require('libxmljs');
var xml =  '<?xml version="1.0" encoding="UTF-8"?>' +
           '<root>' +
               '<child foo="bar">' +
                   '<grandchild baz="fizbuzz">grandchild content</grandchild>' +
               '</child>' +
               '<child foo="bar1">' +
                   '<grandchild baz="fizbuzz">grandchild content 1</grandchild>' +
               '</child>' +
               '<sibling>with content!</sibling>' +
           '</root>';


var xmlDoc = libxml.parseXml(xml);
var allxml = xmlDoc.root();  //store all nodes as allxml
var allNodes = xmlDoc.childNodes(); //all child nodes to array
rec(allxml);

function rec(anElement){
for (var j=0; j<allNodes.length;j++ )
    {
        var firstnode = allNodes[j].name(); //get tagname of the element

        var findelem = xmlDoc.find(firstnode); //find similar elements with the tagname to array
        var currChild = xmlDoc.child(j); //get current child element
        var currnode = xmlDoc.childNodes(); // child nodes of current element to array
        if (hasChild(currChild)) { // check whether this has child elements
                rec(currChild.childNodes()); //if yes recall this function
            }
        else{ replaceCurrentTag(findelem, j);} // if no child nodes replace the name
    }
}

function replaceCurrentTag(currelem, j){

for (var i=0;i<currelem.length;i++){
        currelem[i].name(j.toString());
    }
}

function hasChild(xmlElement){
var e = xmlElement.childNodes();
if (e.length > 0){ return true; }
else return false;
}

console.log(xmlDoc.toString());

Но я получаю эту ошибку, когда запускаю ее в терминале.

/home/compaq/node_modules/libxmljs/lib/document.js:0
(function (exports, require, module, __filename, __dirname) { var bindings = r
^
RangeError: Maximum call stack size exceeded

Что я здесь делаю не так.

Пожалуйста помоги. Спасибо


person Udy Warnasuriya    schedule 16.12.2012    source источник


Ответы (1)


Ваша функция rec перебирает allNodes, а не какое-то подмножество узлов (вероятно, потомков anElement). В сочетании с рекурсией в rec перед вызовом replaceCurrentTag (который никогда не вызывается) ваша функция продолжает вызывать rec до тех пор, пока вы не заполните стек вызовов.

person jbowes    schedule 16.12.2012