2011-11-16 256 views
2

我写了这个程序从树中删除了一个节点,但它仍然存在!从DOM中删除一个节点

这是怎么回事?打印节点内容后,它仍显示与删除节点内容相同的内容,这意味着它仍然存在!

代码:

public class JavaApplication38 { 
    public static void check(Node node){ 


     if (node == null || node.getNodeName() == null) 
    return; 



    check(node.getFirstChild()); 

System.out.println(node.getNodeValue() != null && node.getNodeValue().trim().length() == 0 ? "" : node); 
    if ( "abcd".equals(node.getTextContent())) 
     node.getParentNode().removeChild(node); 
    check(node.getNextSibling()); 

} 
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { 


    File file = new File("d:\\a.xml"); 
    DocumentBuilderFactory dbf = 
    DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document document = db.parse(file); 
    document.getDocumentElement().normalize(); 




    Node b=document.getFirstChild(); 


    check(b); 
    check(b); 

    } 

} 
+1

等等,Java也有这个愚蠢的'node.parentNode.removeChild(node)'模式? –

+1

@Šime:如果您使用DOM API的Java实现,您当然必须忍受DOM API中的所有缺陷。但是对于XML处理通常有更好的选择。 – jarnbjo

回答

5

从树中删除节点,但它确实存在一个节点,没有父节点。除去孩子后,再次执行此

d=document.getElementsByTagName("data1"); 

b=d.item(0); 
System.out.println(b.getTextContent()); 

你不会得到相同的文本内容(如果不同data1标签有不同的内容)。

2

没有,节点删除。
从树中删除节点会自动删除它。

要查看节点是否被正确删除,可以编写一些代码来打印树。

编辑: 我不确定您的check方法是否访问树中的每个节点。
而且我会建议将修改它的代码从代码中分离出来;然后致电

printTree(d); 
    modifyTree(d); 
    printTree(d); 

您似乎了解并理解递归,所以您应该可以编写一个打印树的方法。

+0

有一个遍历树的递归函数,然后我检查节点内容是否等于** abcd **这是** data1 **的文本内容我打印两次,但都是相同的。那么我的代码有什么用吗? 'public static void check(Node node){if(node == null || node.getNodeName()== null) return; if(“abcd”.equals(node.getTextContent())) node.getParentNode()。removeChild(node); check(node.getFirstChild()); System.out.println(node.getNodeValue()!= null && node.getNodeValue()。trim()。length()== 0?“”:node); check(node.getNextSibling());}' – lonesome

+0

那么,它还没有解决呢?那么我建议你更新这个问题。 –

+0

好的。但它只是解决了这个特定的问题 – lonesome