【问题标题】:Java XML removeChild not working?Java XML removeChild 不起作用?
【发布时间】:2018-05-06 03:32:37
【问题描述】:

您好,我已经查了很多这个问题,但找不到有效的解决方案。我基本上是在尝试删除第 7 行中声明并在第 13 行中删除的“作业”节点。运行时错误为 0,但该节点没有被删除。

NodeList rootNodes = xml.getElementsByTagName("jobs");
        Node rootNode = rootNodes.item(0);
        Element rootElement = (Element) rootNode;
        NodeList jobsList = rootElement.getElementsByTagName("job");

        for (int i = 0; i < jobsList.getLength(); i++) {
            Node job = jobsList.item(i);
            Element jobElement = (Element) job;

            if(jobElement.getAttribute("id").equals(
            msgEvent.getMessage().getContentRaw().split(" ")[2]))
            {
                rootNode.removeChild(job);
                msgEvent.getChannel().sendMessage("Removed Job " + jobElement.getAttribute("id") + " (Summary: '" + jobElement.getAttribute("summary") + "')").complete();
            }
        }

这是 XML

<?xml version = "1.0"?>
<jobs>
    <job payment = "50000" poster="171048434529337344" collect = "asdf" id = "1" summary="asdfd" expires="5/10/18"> </job>
    <job payment = "10000" poster="171048434529337344" collect = "asdf" id = "2" summary="asdf" expires="5/10/18"> </job>
</jobs>

【问题讨论】:

  • 你怎么知道节点没有被删除?我试过你的代码,节点确实被删除了。也就是说,当然,如果msgEvent 包含列表中的 id
  • 嗯,我确定 if 语句确实通过了,因为 sendMessage 发生了。然而,它实际上似乎并没有从运行时或 XML 文件中删除节点。
  • 你把xml写回文件了吗?删除仅在内存中

标签: java xml dom


【解决方案1】:

由于太大,无法评论,这是我的测试代码和结果:

public static void main(String[] args) {
    try (InputStream is = Files.newInputStream(Paths.get("C://Temp/xx.xml"))) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document xml = builder.parse(new InputSource(is));

        NodeList rootNodes = xml.getElementsByTagName("jobs");
        Node rootNode = rootNodes.item(0);
        Element rootElement = (Element) rootNode;
        NodeList jobsList = rootElement.getElementsByTagName("job");

        System.out.println("list before removal");
        for (int i = 0; i < jobsList.getLength(); i++) {
            Node job = jobsList.item(i);
            Element jobElement = (Element) job;
            System.out.println(jobElement.getAttribute("id"));
        }

        for (int i = 0; i < jobsList.getLength(); i++) {
            Node job = jobsList.item(i);
            Element jobElement = (Element) job;

            if (jobElement.getAttribute("id").equals("1")) {
                rootNode.removeChild(job);
            }
        }

        System.out.println("list after removal");
        jobsList = rootElement.getElementsByTagName("job");
        for (int i = 0; i < jobsList.getLength(); i++) {
            Node job = jobsList.item(i);
            Element jobElement = (Element) job;
            System.out.println(jobElement.getAttribute("id"));
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

输出:

list before removal
1
2
list after removal
2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2023-04-09
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多