Удалить элемент из документа JDOM, используя removeContent () - PullRequest
2 голосов
/ 12 апреля 2011

Учитывая следующий сценарий, где 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 & Population из xml, просто чтобы посмотреть, была ли это проблема, но, очевидно, это не так.
Другой способ, которым я пытался, я не знаю, почему я знаю, что он существенно не отличается, все же просто ради, был использовать Parent -

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

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

Ответы [ 3 ]

3 голосов
/ 12 апреля 2011

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

2 голосов
/ 12 апреля 2011

Если вы хотите удалить элемент 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 методов.

0 голосов
/ 14 ноября 2018

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

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

el.getParentElement().detach();

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

...