Java - 从动态 XML 中删除子节点

Posted

技术标签:

【中文标题】Java - 从动态 XML 中删除子节点【英文标题】:Java - Delete child node from dynamic XML 【发布时间】:2018-06-14 07:45:47 【问题描述】:

我想删除包含 Base64 格式 PDF 的 XML 节点。这是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<getResult>
   <id>null</id>
   <pdf>ioje98fh23fjkiwf72322342</pdf>
</getResult>

首先,我将 String 中的 XML 转换为 Document,但结果为 null。这是我的代码:

DocumentBuilder dbf = null;
Document doc = null;

try 
    dbf = DocumentBuilderFactory.newInstance().newDocumentBuilder();

    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader("<getResult><id>null</id><pdf>ioje98fh23fjkiwf72322342</pdf></getResult>"));

    doc = dbf.parse(is);

    NodeList children = doc. getChildNodes();

    for (int i = 0; i < children.getLength(); i++) 

        Node currentChild = children.item(i);

        System.out.println(currentChild);

    

 catch (Exception e) 
    System.out.println(e.getMessage().toString());

结果总是:[getResult: null]

考虑到主节点可以变化但结构不变,如何获取PDF节点?

【问题讨论】:

您的文档有一个子节点“getResult”。 “pdf”节点是“getResult”节点的子节点。 【参考方案1】:

这是您可以用来检索数据的方法。

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.w3c.dom.CharacterData;

public class LabFour 
    public static void main(String[] args) 
        DocumentBuilder dbf = null;
        Document doc = null;

        try 
            dbf = DocumentBuilderFactory.newInstance().newDocumentBuilder();

            InputSource is = new InputSource();
            is.setCharacterStream(
                    new StringReader("<getResult><id>null</id><pdf>ioje98fh23fjkiwf72322342</pdf></getResult>"));
            doc = dbf.parse(is);

            NodeList nodes = doc.getElementsByTagName("getResult");

            for (int i = 0; i < nodes.getLength(); i++) 
                Element element = (Element) nodes.item(i);

                NodeList name = element.getElementsByTagName("id");
                Element line = (Element) name.item(0);
                System.out.println("id: " + getCharacterDataFromElement(line));

                NodeList pdf = element.getElementsByTagName("pdf");
                line = (Element) title.item(0);
                System.out.println("pdf: " + getCharacterDataFromElement(pdf));
            

         catch (Exception e) 
            e.printStackTrace();
        

    

    public static String getCharacterDataFromElement(Element e) 
        Node child = e.getFirstChild();
        if (child instanceof CharacterData) 
            CharacterData cd = (CharacterData) child;
            return cd.getData();
        
        return "?";
    


【讨论】:

【参考方案2】:

SimpleXml 可以做到:

final SimpleXml simple = new SimpleXml();
final Element element = simple.fromXml(data);
element.children.remove(1);
System.out.println(simple.domToXml(element));

将输出:

<getResult><id>null</id></getResult>

来自 Maven 中心:

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>1.4.0</version>
</dependency>

【讨论】:

以上是关于Java - 从动态 XML 中删除子节点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XPATH for XML 获取子节点数

是元素节点的属性节点子节点

easyui tree 怎么获取选择节点子节点上的值?js怎么写?

删除节点(removeChild())

数据结构--二叉树(Java)

高手帮忙:sql 里怎样递归判断父节点和子节