首页 > 解决方案 > 如何使用 Java 从 XML 中删除子元素?

问题描述

<definitions>
   <form name="enable">
      <data1>...</data1>
      <data2>...</data2>
      <data3>...</data3>
   </form>
   <form>
      <data1>...</data1>
      <data2>...</data2>
      <data3>...</data3>
   </form>
   ...
</definitions>

我想删除具有该name属性的定义标记子元素(表单)。例如:在上述情况下,我想form从文档中删除第一个元素。如何在java中做到这一点?

标签: javaxmldom

解决方案


删除所有具有该name属性的表单的代码:

import java.io.File;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class XMLDemo {

    public static void main(String[] args) throws Exception {

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        Document document = dbf.newDocumentBuilder().parse(new File("input.xml"));

        XPathFactory xpf = XPathFactory.newInstance();
        XPath xpath = xpf.newXPath();

        // Create XPathExpression object
        XPathExpression expression = xpath.compile("/definitions/form[@name]");

        // Evaluate expression result on XML document
        NodeList nodes = (NodeList) expression.evaluate(document, XPathConstants.NODESET);

        if (nodes.getLength() > 0) {
            for (int i = 0; i < nodes.getLength(); i++) {
                Node node = nodes.item(i);
                node.getParentNode().removeChild(node);
            }
        }

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        t.transform(new DOMSource(document), new StreamResult(System.out));
    }
}

如果您只想删除表单,请name = "enable"进行此更改:

// Create XPathExpression object
XPathExpression expression = xpath.compile("/definitions/form[contains(@name, 'enable')]");

推荐阅读