我写了一个简单的函数来将内容(包括所有子节点)从一个节点复制到另一个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>
答案 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。