【问题标题】:How to remove child elements from XML using Java?如何使用 Java 从 XML 中删除子元素?
【发布时间】:2021-04-25 21:16:07
【问题描述】:
<definitions>
   <form name="enable">
      <data1>...</data1>
      <data2>...</data2>
      <data3>...</data3>
   </form>
   <form>
      <data1>...</data1>
      <data2>...</data2>
      <data3>...</data3>
   </form>
   ...
</definitions>

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

【问题讨论】:

  • 您是仅将 XML 作为字符串,还是在内部将其映射到某些对象?另外,您是否使用任何 XML 解析库?
  • @PetrePopescu 是的,我将这个 XML 数据作为一个字符串,我正在使用 Java DOM 解析器来解析这个 XML 数据。
  • name字段可以有不同的值吗? @史蒂夫罗杰斯
  • 是的@ismlyldz name 属性具有不同的值。我的用例是,我有一个字符串并一个一个地迭代表单元素。如果form 名称字段属性中的任何一个与字符串匹配/等于,我只想从definitions 标记中删除该form
  • 如果没有 XML 解析库,我唯一的解决方案就是字符串操作。 (使用子字符串、字符串追加等)。如果这对您来说可以,我可以在答案中编写一个快速原型。

标签: java xml dom


【解决方案1】:

删除所有具有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')]");

【讨论】:

  • 感谢您的回复。此代码工作正常并解决了上述用例。我还有一个疑问,是否可以在 compile() 中添加另一个属性名称?
  • 是的,您可以尝试许多功能。您也可以浏览此链接。 howtodoinjava.com/java/xml/java-xpath-expression-examples@SteveRogers
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多