#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();
Это приведет к удалению родительского элемента со всеми его дочерними элементами!