当前位置: 首页 > 知识库问答 >
问题:

无法通过Java代码从XML文档中删除元素和子元素

吉泰宁
2023-03-14

这是我的xml文档:

<definitions>       
<task name="TASK1"
     class="CLASS"
     group="GROUP">
  <trigger count="3" interval="400"/>
  <property xmlns:task="URI"
            name="PROPERTY2"
            value="VALUE1"/>
  <property xmlns:task="URI"
            name="PROPERTY2"
            value="VALUE2"/>
</task>
<task name="TASK1"
     class="CLASS"
     group="GROUP">
  <trigger count="1" interval="600"/>
  <property xmlns:task="URI"
            name="PROPERTY2"
            value="VALUE1"/>
  <property xmlns:task="URI"
            name="PROPERTY2"
            value="VALUE2"/>
</task>
<another_tag name="a_name"/>
<another_tag2 name="a_name2"/>
<another_tag3>  something in the middle </another_tag3>

</definitions>

我必须删除所有<代码>

Document esb = new Document();

    SAXBuilder saxBuilder = new SAXBuilder();


    try {
       esb = saxBuilder.build(new File("C:\\...path\\file.xml")); 
    }
    catch (JDOMException ex) {
       System.err.println(ex);
    }
    catch (IOException ex) {
       System.err.println(ex);
    }
    Element root = esb.getRootElement();
    boolean b = root.removeChild("task");
    System.out.println(b);

我不明白如何在没有的情况下获取xml文件


共有3个答案

冯茂实
2023-03-14

我通过管理名称空间解决了这个问题。代码如下:`

Document doc = new Document();

SAXBuilder saxBuilder = new SAXBuilder();
try {
       doc = saxBuilder.build(new File("....path\MyXMLfile.xml")); 
    }
    catch (JDOMException ex) {
       System.err.println(ex);
    }
    catch (IOException ex) {
       System.err.println(ex);
    }


    Element root = esb.getRootElement();
    System.out.println(root.getName());  // it prints "definitions"

    Namespace namespace = Namespace.getNamespace("task","http://....myDefinitionsNamespace....");

    boolean b = root.removeChildren("task", namespace);

    System.out.println(b);

    XMLOutputter xmlOutputter = new XMLOutputter();
    xmlOutputter.setFormat(Format.getPrettyFormat());
    System.out.println(xmlOutputter.outputString(doc)); //so we can see new XML FILE

为了理解这段代码,我们还需要启动xml:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://....myDefinitionsNamespace....">
<task name="MyTask"
     class="....myClass...."
     group="....myGroup...."> 
<taskChild/>
</task>
<anotherTag1/>
<anotherTag2>
<task/>
.
.
.
</definitions>

结果是一个没有每个任务标记的XML文件,它将只包含另一个标记。然后需要定义输出(例如,将输出定义到具有FileOutputStream实例的文件中)。感谢“OkieOth”和“rolfl”。

乐山
2023-03-14

除了OkieOth所说的之外,您只删除了第一个任务。

另一个问题是您没有将JDOM再次写入文件。您需要保存现有文件以查看更改。

如果要将更改应用回文件,请考虑以下事项:

SAXBuilder saxBuilder = new SAXBuilder();

try {
    Document esb = saxBuilder.build(new File("C:\\...path\\file.xml")); 
    Element root = esb.getRootElement();
    boolean b = root.removeChild("task");
    System.out.println(b);
    XMLOutputter xout = new XMLOutputter(Format.getPrettyFormat());
    try (OutputStream os = new FileOutputStream("C:\\...path\\file.xml")) {
        xout.output(os, esb)
    }
}
catch (JDOMException ex) {
   System.err.println(ex);
}
catch (IOException ex) {
   System.err.println(ex);
}
赫连开畅
2023-03-14

api对函数“removeChild”这样说:。。。这将删除具有给定本地名称且不属于任何命名空间的第一个子元素(一层深)。。。

removeChild函数只删除一个子级。因此,如果要删除具有特定名称的所有子对象,则需要使用循环。如果函数调用找不到具有所需名称的节点,则返回false。

如果我使用您的示例xml,远程儿童的第三次调用返回为false。因此以下代码将删除所有任务儿童

...
    boolean b = root.removeChild("task");
    while (b)
        b = root.removeChild("task");
...
 类似资料:
  • 我正在尝试从xml文件中删除元素和子元素。特别是附加名称Testlog。 首先这是我的xml文件的外观。 以下是我的java代码: 我想删除此appender的所有内容,但引发了一个异常。可能是我错过了一些简单的东西。 有什么想法吗?

  • 问题内容: 我已经从Excel数据库中生成了一个xml文件,它自动包含一个名为“ ” 的元素。为了使新文件符合我的需求,我想使用java删除此元素。这是xml内容: 我编写了一个代码来读取(使用缓冲的读取器)并将内容写入新文件中,并在以下情况下使用该条件: 但这不起作用 问题答案: 我个人建议使用适当的XML解析器(如Java DOM)来检查和删除您的节点,而不是将XML作为原始对象处理(糟糕)。

  • 这是我的XML文件 我只想从xml中删除第二个选项 我的java代码从我的选项元素中删除所有选项。使用

  • 问题内容: Python 3.2.5 x64 ElementTree 我有需要使用python格式化的数据。本质上,我具有包含元素和子元素的文件。我需要删除其中一些元素的子元素。我已经检查了先前的问题,但无法解决。到目前为止,我拥有的最好的功能只是删除了每个第二子元素。 样本数据: 我需要的输出看起来像: 我有一段时间没有写任何东西了,我的代码也没用。我可以解析文件,然后将其写入,但我无法正确处理

  • 问题内容: AFAIK有两种方法: 遍历集合的副本 使用实际集合的迭代器 例如, 和 是否有任何理由偏爱一种方法(例如,出于可读性的简单原因而偏爱第一种方法)? 问题答案: 让我举几个例子,并提出一些避免方案。 假设我们有以下藏书 收集并删除 第一种技术是收集所有要删除的对象(例如,使用增强的for循环),并在完成迭代后删除所有找到的对象。 假设你要执行的操作是“删除”。 如果要“添加”此方法也可

  • 问题内容: 有什么快速(好看的)方法可以从Java中的数组中删除元素? 问题答案: 你可以使用的。