Удалить узел из файла XML (DOM4J, JAVA)

Поскольку все остальные вопросы, связанные с этой темой, относятся к конкретной проблеме программирования (например, "Я получаю исключение NullPointerException, когда пробую то-то и то-то"), а ответы исправляют ошибки программирования, вот простое решение. на следующий вопрос:

Как удалить узел из XML-файла с помощью DOM4J?


person Maurice Müller    schedule 05.04.2016    source источник


Ответы (2)


Предполагая, что у вас уже есть узел, который вы хотите удалить:

  Document document = node.getDocument();

  node.detach();

  XMLWriter writer = new XMLWriter(new FileWriter(document.getPath() + document.getName()), OutputFormat.createPrettyPrint());
  writer.write(document);
  writer.close();

Оператор try-catch опущен.

Краткое объяснение:

  1. Получение документа и сохранение его в локальной переменной необходимо, потому что после отсоединения узла вы не можете получить документ, вызвав node.getDocument()
  2. вызов detach() для узла удалит узел из объекта документа (не из файла)
  3. создание XMLWriter с помощью OutputFormat.createPrettyPrint() необходимо, если вы не хотите, чтобы после этого в документе оставались пустые строки

Для более полного примера, вот тест JUnit:

@Test
public void dom4j() throws DocumentException, IOException {
  String absolutePath = Paths.get(PATH_TO_XML).toAbsolutePath().toString();

  SAXReader reader = new SAXReader();
  Document document = reader.read(absolutePath);
  Node node = document.selectSingleNode(XPATH_TO_NODE);

  node.detach();

  XMLWriter writer = new XMLWriter(new FileWriter(absolutePath), OutputFormat.createPrettyPrint());
  writer.write(document);
  writer.close();
}

Для получения дополнительной информации о DOM4J см.: http://dom4j.sourceforge.net/dom4j-1.6.1/guide.html

И дополнительная информация о синтаксисе XPath: http://www.w3schools.com/xsl/xpath_syntax.asp< /а>

person Maurice Müller    schedule 05.04.2016

Чтобы удалить узел с помощью XPath, вы можете сделать это в vtd-xml.

import com.ximpleware.*;
import java.io.*;

public class removeElement {
    public static void main(String s[]) throws VTDException,IOException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("input.xml", false))
            return;
        VTDNav vn = vg.getNav();
        XMLModifier xm = new XMLModifier(vn);
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/ClOrdIDS/ClOrdID[@id='3']");
        int i=0;
        while((i=ap.evalXPath())!=-1){
            xm.remove();
        }
        xm.output("output.xml");
    }
}
person vtd-xml-author    schedule 05.04.2016
comment
Как бы я ни ценил новые решения: это не ответ на вопрос. Это ответ на вопрос Как удалить узел из XML-файла с помощью XPath и vtd-xml? или на заголовок Удалить узел из XML-файла (XPATH, VTD-XML, ЯВА) - person Maurice Müller; 06.04.2016