未能将我的XML文档移至removeChild

时间:2012-11-09 11:47:44

标签: javascript xml dom removechild

我在从文档中删除XML元素时遇到问题。我已经搜索了论坛,我认为我正在做正确的事情,请你能帮我解释一下我搞砸的地方吗?

我有一个包含我正在循环的ID的数组。在该循环中,我循环遍历XML文档以查找其中" myId" attribute与数组中的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); line导致脚本失败,它永远不会被删除&#39;状态。

我很感激任何正确方向的帮助/指示。

谢谢,Mark

2 个答案:

答案 0 :(得分:0)

getElementsByTagName可以在DOM树的所有级别找到元素,而不仅仅是文档元素的直接子元素。您不需要尝试从y中删除documentElement,而是需要获取y的父节点(可能是文档元素或可能在树的下方更深处),然后从y >那

答案 1 :(得分: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);
    } 
  }
}