Удалить элемент из документа JDOM с помощью removeContent()

#java #xml #jdom

#java #xml #jdom

Вопрос:

Учитывая следующий сценарий, где xml, Geography.xml выглядит так —

 <Geography xmlns:ns="some valid namespace">
    <Country>
        <Region>
            <State>
                <City>
                    <Name></Name>
                    <Population></Population>
                </City>
            </State>
            </Region>
        </Country>
    </Geography>
  

и следующий пример кода Java —

 InputStream is = new FileInputStream("C:\Geography.xml");
SAXBuilder saxBuilder = new SAXBuilder();
Document doc = saxBuilder.build(is);

XPath xpath = XPath.newInstance("/*/Country/Region/State/City");
Element el = (Element) xpath.selectSingleNode(doc);
boolean b = doc.removeContent(el);
  

removeContent() Метод не удаляет элемент City из списка содержимого doc . Значение b равно false
Я не понимаю, почему элемент не удаляется, я даже пытался удалить элементы Name amp; Population из xml, просто чтобы посмотреть, было ли это проблемой, но, по-видимому, это не так.
Другой способ, который я пробовал, я не знаю, почему я знаю, что он существенно не отличается, но все же просто так, заключался в использовании Parent

 Parent p = el.getParent();
boolean s = p.removeContent(new Element("City"));
  

В чем может быть проблема? и возможное решение? и если кто-нибудь может поделиться реальным поведением метода removeContent() , я подозреваю, что это связано с отношениями родитель-потомок.

Комментарии:

1. Что такое res ? Другой документ?

2. @Thomas — Ой!, очень сожалею об опечатке. Исправлено сейчас.

Ответ №1:

Конечно, removeContent(Content child) удаляет дочерний элемент, если дочерний элемент принадлежит непосредственным дочерним элементам родителей, чего в вашем случае нет. Используйте el.detach() вместо этого.

Комментарии:

1. @dogbane Оба эти решения, похоже, работают, и теперь я понимаю, почему это не работало раньше. Большое спасибо. Я должен выбрать одно решение, поэтому я мог бы просто выбрать это, если вы, ребята, по какой-то причине не думаете иначе.

Ответ №2:

Если вы хотите удалить City элемент, найдите его родительский элемент и вызовите removeContent :

     XPath xpath = XPath.newInstance("/*/Country/Region/State/City");
    Element el = (Element) xpath.selectSingleNode(doc);
    el.getParent().removeContent(el);
  

Причина, по которой doc.removeContent(el) не работает, заключается в том, что el не является дочерним элементом doc .

Проверьте javadocs для получения подробной информации. Там есть несколько перегруженных removeContent методов.

Комментарии:

1. el.detach() делает el.getParent().removeContent(el); и является более читаемым.

Ответ №3:

Этот способ работает с учетом того, что .getParent() возвращает родительский объект вместо объекта Element, а метод detach (), который устраняет фактический узел, должен вызываться из элемента.

Вместо этого выполните:

 el.getParentElement().detach();
  

Это приведет к удалению родительского элемента со всеми его дочерними элементами!