代码之家  ›  专栏  ›  技术社区  ›  AddyProg

从XML中删除整个记录

  •  0
  • AddyProg  · 技术社区  · 10 年前

    我试图使用XPath从XML文件中删除节点及其子节点。这是我尝试过的,但不起作用。

    以下是xml:

    <registration>
       <users>
         <name>abc</name>
         <class>10th</class>
         <email>demo@mail.com</email>
       </users>
    </registration>
    

    我通过搜索该电子邮件的特定记录,然后删除它,从用户那里获得电子邮件地址。

    代码如下:

    XPath xPath = XPathFactory.newInstance().newXPath();
    String expression = "//email[text()='" + sEmail + "']";
    System.out.println(expression);
    Node node = (Node) xPath.compile(expression).evaluate(xmlDocument,XPathConstants.NODE);
    if (null != node) {
      Node pNode = node.getParentNode();
      nodeList = pNode.getChildNodes();
      for (int i = 0; null != nodeList && i < nodeList.getLength(); i++) {
        Node nod = nodeList.item(i);
        if (nod.getNodeType() == Node.ELEMENT_NODE) {
          System.out.println(nod.getNodeName() + " : "nod.getFirstChild().getNodeValue());
          Node cNode = nod.getFirstChild();
      nod.getParentNode().removeChild(cNode);                
        }
      }
    }
    

    以下是我得到的例外:

    04-03 15:39:18.274: E/AndroidRuntime(23163):    at org.apache.harmony.xml.dom.InnerNodeImpl.removeChild(InnerNodeImpl.java:181)
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   dirkk    10 年前

    应该是

    cNode.getParentNode().removeChild(cNode);
    

    nod.removeChild(cNode);
    

    让我们说 A 是的父节点 nod 。您当前试图做的是删除孩子 cNode 从…起 A. ,而您要删除子项 c节点 从…起 点头

    使现代化

    如果要删除整个 <user/> 记录比代码简单得多。无需手动删除每个和每个子元素。

    XPath xPath = XPathFactory.newInstance().newXPath();
    String expression = "//user[email='" + sEmail + "']";
    System.out.println(expression);
    Node node = (Node) xPath.compile(expression).evaluate(xmlDocument,XPathConstants.NODE);
    if (node != null) node.getParentNode().removeChild(node);