2012-11-09 23 views
1

我在从我的文档中移除XML元素时遇到问题。我已经搜索论坛,我认为我正在做的事情,请你能帮我解释一下我搞砸了什么?无法让我的XML文档移除孩子

我有一个数组包含我正在循环的ID。在那个循环中,我循环访问XML文档以查找其“myId”属性与数组中的ID相同的元素。 当我找到一个我想从XML文档中删除该元素。

这里是我的代码:

var xmlFilename=document.getElementById('xmlFilename').value; 
    if (window.XMLHttpRequest) 
     {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
     } 
    else 
     {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

    xmlhttp.open("GET",xmlFilename,false); 
    xmlhttp.send(); 
    xmlDoc=xmlhttp.responseXML; 

    // lets get all the xml elements into xAll 
    var xAll=xmlDoc.getElementsByTagName('*'); 
    // lets use the buttonList array - this corresponds to the elements in the xml to hide 

    for (var i=0; i<buttonList.length;i++) { 
     alert ("Looking for "+buttonList[i]); 
     //find the XML node with the same id 
     for(var j=0;j<xAll.length;j++) { 
      y=xAll[j]; 
      if (y.getAttribute('myId')==buttonList[i]) { 
       alert('Found a match'); 
       xmlDoc.documentElement.removeChild(y); 
       alert('removed'); 
      } 
     } 
     alert('next!'); 
    } 
    alert('all done'); 

它通过循环预期,但是当它找到一个匹配的xmlDoc.documentElement.removeChild(Y); 行会导致脚本失败,并且永远不会处于“已删除”状态。

我很感谢任何正确的方向帮助/指针。

谢谢,马克

+1

你能引擎收录的XML的一个片段?您正在从'documentElement'中移除子项 - 但是这些节点是否指向'root'节点的子项? – Kami

+0

示例XML: ' \t

\t \t 资料 \t \t 这是介绍文字 \t \t 真棒语句 \t \t 我是声明 \t \t 我另一语句 \t \t 这是与MYID的元素可以出现在XML内不同水平的出口文本 \t
' 。 –

+0

的确,您正在删除不是“documentElement”子节点的节点,这就是为什么它失败。查看Yoshi发布的解决方案的答案。 – Kami

回答

0

尝试:

var i = 0, j, y; 
for (; i < buttonList.length; i += 1) { 
    // Running "backwards" is done on purpose, as `xAll` is a "live" NodeList. 
    // If otherwise, you'd run into problems regarding wrong indexes. 
    for(j = xAll.length - 1; j >= 0; j -= 1) { 
    y = xAll[j]; 
    if (y.getAttribute('myId') == buttonList[i]) { 
     y.parentNode.removeChild(y); 
    } 
    } 
} 
+0

非常感谢Yoshi - 伊恩回答的一个实例。我也喜欢关于向内运行内部循环的建议。 –

0

getElementsByTagName可以找到DOM树的各个层次的元素,文档元素的不只是直接孩子。您不需要从documentElement中删除y,您需要获取y的父节点(可能是文档元素,或者可能是更深层的树),然后从删除y

+0

非常感谢你伊恩 - 你指出我的错误。 –