从XML文件中删除节点的Java程序

3

当我尝试从Java程序中删除XML节点时,它会出现奇怪的问题。它会删除交替的节点。在插入新节点之前,我必须先删除现有节点。 我的XML文件如下:

<?xml version="1.0" encoding="windows-1252" ?>
<chart>
<categories>
 <category label="3 seconds"/>
 <category label="6 seconds"/>
 <category label="9 seconds"/>
 <category label="12 seconds"/>
</categories>

</chart>

我的Java程序如下:

      DocumentBuilderFactory  docFactory  = DocumentBuilderFactory.newInstance();
      DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

      Document doc = docBuilder.parse(filePath);


      Node categories = doc.getElementsByTagName("categories").item(0);

      NodeList categorieslist = categories.getChildNodes();

      // if exists delete old data the insert new data.


      for (int c = 0; c < categorieslist.getLength(); c++) {

        Node node = categorieslist.item(c);
        categories.removeChild(node);
      }
    for(int i=1;i<20;i++){

    Element category = doc.createElement("category");
    category.setAttribute("label",3*i+" seconds");
    categories.appendChild(category);
  }

这段代码正在删除某些节点,但我不知道为什么。生成的XML如下所示:
<categories>
 <category label="6 seconds"/>
 <category label="12 seconds"/>
 <category label="3 seconds"/>
 <category label="6 seconds"/>
 <category label="9 seconds"/>
      .....
      .....
 </categories>

当我尝试从for循环中打印c值时,它只打印列表值的一半大小。 - mallikarjun
当我在循环中不增加“c”值时,问题得到解决。但我不知道为什么,请有人能解释一下吗? - mallikarjun
1
当您删除节点0时,所有节点都会向左移动。因此,节点1变为节点0。然后,您尝试删除节点1,但从未返回删除节点0。因此,您完全错过了原始节点1。 - GC_
1个回答

6
每次移除一个子元素,列表长度就会变短。该列表不是静态集合,因此每次调用getLength()函数都会返回实际大小。
Node categories = doc.getElementsByTagName("categories").item(0);
NodeList categorieslist = categories.getChildNodes();
while (categorieslist.getLength() > 0) {
    Node node = categorieslist.item(0);
    node.getParentNode().removeChild(node);
}

但为什么它要删除备用节点? - mallikarjun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接