以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  如何在DOM中删除某一特点结点  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=18070)


--  作者:sharri
--  发布时间:5/10/2005 1:06:00 PM

--  如何在DOM中删除某一特点结点
我的这段程序是一个递归,根据输入的字符串查找到相应结点并修改其值.同时,在次过程中若发现另一指定结点,这里为删除status=“absent”的<senator>.但是程序运行时总是在该结点被删除之后报错,说出现空的指针. 谁能帮我解决这个问题?

//////////////////////////////////////////////////////////////////////
    public static void findLoop(Node newNode, String newDate)
    {
      if (newNode.getNodeName().equals("date")) {
        newNode.getFirstChild().setNodeValue(newDate);
      }

      if ((newNode.getNodeName().equals("senator"))&& ( ( (Element) newNode).getAttributeNode("status").getNodeValue().
            equals("absent"))) {
          System.out.println(
              "yes,already found the node which need to be removed!");
          Node parent = newNode.getParentNode();
          parent.removeChild(newNode);
          System.out.println("yes,already  removed!");

          }
        else {

          NodeList childs = newNode.getChildNodes();
          if (childs != null) {
            int length = childs.getLength();
            for (int loopIndex = 0; loopIndex < length; loopIndex++) {
              findLoop(childs.item(loopIndex), newDate);

            }
          }
        }
      }


//////////////////////////////////////////////////////////////////////////


--  作者:xhxasdf
--  发布时间:5/11/2005 9:15:00 AM

--  
女的   搞  xml   强
--  作者:栖霞旧友
--  发布时间:5/11/2005 9:25:00 PM

--  
public static void removeNode(Document doc)
 {
 
  Element root = doc.getDocumentElement();
  NodeList children = root.getChildNodes();
  for (int i = 0; i <children.getLength(); i++)
  {
   if ((children.item(i).getNodeName().equals("senator"))&& ( children.item(i).getAttributes().getNamedItem("status").getNodeValue(). equals("absent")))
   {
    System.out.println(
     "yes,already found the node which need to be removed!");
    Node parent = children.item(i).getParentNode();
    parent.removeChild(children.item(i));
    System.out.println("yes,already  removed!");

   }

  }
这样应该可以


--  作者:sharri
--  发布时间:5/11/2005 9:59:00 PM

--  
谢谢栖霞旧友!不过这样还是解决不了问题的。你这里用循环只检测了根节点下的第一层子节点,如果我要删除的节点在第二层,程序就不会找到它。而这个程序应该是能够删除任一层的复合该条件的节点,所以我用了递归。我想应该是递归时出的错误。可能我应该避免用递归的方法,但是我想不出别的办法。

--  作者:残墨
--  发布时间:6/10/2005 11:20:00 AM

--  
关注中。
--  作者:zb9030@126.com
--  发布时间:7/22/2005 2:47:00 PM

--  
我找一个方法,不用递归找,就可以删除
--  作者:zb9030@126.com
--  发布时间:7/22/2005 2:53:00 PM

--  
先用svgDocument.getElementById("删除的ID")得到它的节点,再用getParentNode()得到它的父节点.再用父节点删除它的子节点;这样就不用递归了,效率高好多
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms