2012-12-16 3 views
1

길이가 긴 XML 태그를 int 값으로 대체하려고합니다. 예 ''로 '< 1>'이므로 전체 XML 파일에서 'child'라는 이름을 가진 모든 태그는 '1'로 바뀝니다. 나는 NodeJS에서 libxmljs를 사용하고있다. 지금까지 내 코드는;NodeJS의 libxmljs RangeError

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 

내가 여기서 잘못하고있는 것은 무엇입니까?

도와주세요. 오히려 노드 (anElement의 아마 아이들)의 일부 부분 집합보다 allNodes을 통해 당신에게

답변

0

귀하의 rec 기능의 반복을 감사드립니다. replaceCurrentTag (결코 호출되지 않음)을 호출하기 전에 다시 rec에 재귀하는 것과 결합하여 함수는 호출 스택을 채울 때까지 rec을 계속 호출합니다.