在JavaScript中将一个DOM XML节点复制到另一个DOM节点

时间:2009-06-05 07:51:55

标签: javascript xml dom

我写了一个简单的函数来将内容(包括所有子节点)从一个节点复制到另一个XML DOM对象。

令人惊讶的是,在函数中,for循环不会因n = 1而迭代,因为我无法弄清楚,请帮助,我一直试图从4天开始以所有可能的方式调试它。

此函数不是针对n = 1进行迭代(即,它是针对n = 0和n = 2进行迭代,依此类推,除了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 个答案:

答案 0 :(得分:3)

当您将源节点移动(不复制)到目标时,它们将从源上的childNodes列表中删除,并且其长度会减少。

你应该使用类似的东西:

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

代替。

另外,你不需要递归;移动节点时,其所有子节点都将随之移动。

答案 1 :(得分:0)

你的专栏:

copyNode(toChild, fromChild);

应该是

copyNode(fromChild, toChild);

当你的函数来自递归时,你的fromChild元素是空的......

答案 2 :(得分: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。