2009-06-05 10 views
2

J'ai écrit une fonction simple pour copier le contenu (y compris tous les noeuds enfants) d'un noeud à un autre d'un objet DOM XML. Étonnamment dans la fonction, la boucle for n'écrit pas pour n = 1 pour une raison quelconque je ne peux pas comprendre, s'il vous plaît aider, j'ai essayé de déboguer de toutes les manières possibles à partir de 4 jours.Copie d'un noeud XML DOM vers un autre en JavaScript

Cette fonction n'est pas une itération pour n = 1 (il est itérer pour n = 0 et n = 2 et ainsi de suite, sauf n = 1):

function copyNode(fromNode, toNode) { 

for (var n=0; n [lessthan] fromNode.childNodes.length; n++) { 
    var fromChild = fromNode.childNodes[n]; 
    var toChild = toNode.appendChild(fromChild); 
    copyNode(fromChild, toChild); 
} 
} 

code complet:

<html> 
<head> 


<script type="text/javascript"> 

//STANDARD TEXT to XMLDOM OBJECT RETURN FUNCTION 
function getXmlDoc(text){ 
var xmldoc = null; 
try //Internet Explorer 
{ 
xmldoc=new ActiveXObject("Microsoft.XMLDOM"); 
xmldoc.async="false"; 
xmldoc.loadXML(text); 
return xmldoc; 
} 
catch(e) 
{ 
try //Firefox, Mozilla, Opera, etc. 
{ 
parser=new DOMParser(); 
xmldoc=parser.parseFromString(text,"text/xml"); 
return xmldoc; 
} 
catch(e) 
{ 
alert(e.message); 
return; 
} 
} 
} 
//END OF getXmlDoc 

//Function that refuses to work, the 2nd child is always being skipped, i.e n=1 is never running :(, ONLY n=1 is not running 
function copyNode(fromNode, toNode) { 

for (var n=0; n [lessthan] fromNode.childNodes.length; n++) { 
    var fromChild = fromNode.childNodes[n]; 
    var toChild = toNode.appendChild(fromChild); 
    copyNode(fromChild, toChild); 
} 
} 

//Function to clear a node's contents 
function clearNode(node2) 
{ 
x2=node2.childNodes; 
if(x2.length!=0) 
{ 
for(i=0;i [lessthan] x2.length;i++) 
{ 
    node2.removeChild(x2[i]); 
} 
} 
} 

//XML1 
text="<book>"; 
text=text+"<title>Everyday Italian</title>"; 
text=text+"<author>Giada De Laurentiis</author>"; 
text=text+"<year>2005</year>"; 
text=text+"</book>"; 

xmlDoc=getXmlDoc(text); 

//XML2 
text2="<book>"; 
text2=text2+"<title><a>1</a><b>2</b><c><ca>3</ca></c></title>"; 
text2=text2+"<year>2006</year>"; 
text2=text2+"</book>"; 

xmlDoc2=getXmlDoc(text2); 

x=xmlDoc.documentElement.childNodes; 
y=xmlDoc2.documentElement.childNodes; 
var string = (new XMLSerializer()).serializeToString(y[0]); 
alert(string); 
var string = (new XMLSerializer()).serializeToString(x[0]); 
alert(string); 
clearNode(x[0]); 
copyNode(y[0],x[0]); 
var string = (new XMLSerializer()).serializeToString(xmlDoc); 
alert(string); 
</script> 
</head> 
<body> 
</body> 
</html> 

Répondre

3

Comme vous vous déplacez (ne pas copier) les noeuds source à la destination, ils sont retirés de la liste des childNodes sur la source, et son la longueur diminue.

Vous devez utiliser quelque chose comme:

while (fromNode.firstChild) { 
    toNode.appendChild(fromNode.firstChild); 
} 

à la place.

De plus, vous n'avez pas besoin de la récursivité; lorsque le nœud est déplacé, tous ses enfants seront déplacés avec lui.

+0

merci, monsieur, vous m'avez sauvé des dommages au cerveau. Je pensais que c'était copier le nœud et ne pas le déplacer car aucune des fonctions ne spécifie explicitement le mot déplacer/copier. et j'étais toujours en train de déboguer pour vérifier le nœud résultant et ne jamais vérifier ce qui arrivait au nœud source. ty encore une fois – smhx

0

Votre ligne:

copyNode(toChild, fromChild); 

doit être

copyNode(fromChild, toChild); 

Lorsque votre fonction est de récursion votre élément fromChild est vide ...

+0

oui monsieur, j'ai changé cela aussi, ça ne marche pas. – smhx

0

Voici comment je le ferais (ce qui peut être préférable ou non).

function copyElementChildren(fromNode,toNode){ 
    for (var i in fromNode.childNodes) { 
     var node = fromNode.childNodes[i].cloneNode(true); 
     toNode.appendChild(node); 
    }; 
}; 

Ceci utilise le clonage pour copier l'élément. Le paramètre true in cloneNode (true) indique au navigateur de copier également ses attributs et childNodes.

+0

merci pour la réponse, mais j'ai eu cette erreur dans firefox " Erreur: fromNode.childNodes [i] .cloneNode n'est pas une fonction" je dint explorer plus loin parce que la solution ci-dessus a fonctionné, s'il vous plaît laissez-moi savoir si vous voulez que je débogue le code avec votre solution. – smhx

+0

C'est intéressant. J'avoue que je n'ai pas testé le code car je n'ai jamais eu besoin de cloner un noeud auparavant. J'ai pris cloneNode de https://developer.mozilla.org/En/DOM/Node.cloneNode donc je suis surpris que cela n'a pas fonctionné. – trydyingtolive

Questions connexes