2009-06-05 25 views
2

XML DOMオブジェクトのあるノードから別のノードにコンテンツ(すべての子ノードを含む)をコピーする簡単な関数を書きました。1つのDOM XMLノードを別のノードにコピーする

驚いたことに、forループは、何らかの理由でn = 1で繰り返されていません。私は理解できません。私は4日間から可能な限りすべてデバッグしようとしています。

この関数は(すなわち、n = 0のための反復であり、n = 2など以外のn = 1'S)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); 
} 
} 

フルコード:

<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> 

答えて

3

あなたが先に(コピーしない)ソース・ノードを移動すると、それらはソース上のchildNodesのリストから削除され、そしてその長さは減少する。代わりに

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

次のようなものを使用する必要があります。

また、再帰は必要ありません。ノードが移動すると、すべての子ノードも移動します。

+0

ありがとうございました、脳の損傷から私を救った。私はノードをコピーしていて、移動しないと思っていました。機能のどれも明示的にmove/copyという単語を指定していないからです。結果のノードをチェックし、ソースノードに何が起きているのかを決してチェックしないように常にデバッグしていました。もう一度 – smhx

0
あなたのライン

copyNode(toChild, fromChild); 

0にしてください

あなたの機能はあなたのfromChild要素が空である再帰から来ている...

+0

はい、私もそれを切り替えた、それは動作しません。 – smhx

0

これは私がやる方法です(これが望ましいかもしれません)。

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

これは、要素をコピーするためにクローニングを使用します。 cloneNode(true)のtrueは、ブラウザにその属性とchildNodesもコピーするように指示します。

+0

答えに感謝しますが、私はこのエラーをFirefoxで取得しました。 " エラー:fromNode.childNodes [i] .cloneNodeは関数ではありません" 上記の解決策が働いたため、私はあなたのソリューションでコードをデバッグしたいと思っています。 – smhx

+0

それは面白いです。以前はノードをクローンする必要はなかったので、私はコードをテストしなかったと告白します。私はhttps://developer.mozilla.org/En/DOM/Node.cloneNodeからcloneNodeを取得したので、動作しなかったことに驚いています。 – trydyingtolive

関連する問題