Как я могу вставить узел перед другим, используя dom4j? - PullRequest
4 голосов
/ 27 сентября 2011

У меня есть org.dom4j.Document экземпляр, который является реализацией DefaultDocument, чтобы быть конкретным. Я хотел бы вставить новый узел непосредственно перед другим. Я не совсем понимаю API dom4j, меня смущают различия между Element и DOMElement и прочим.

org.dom4j.dom.DOMElement.insertBefore не работает для меня, потому что мой узел не является элементом DOME. DOMNodeHelper.insertBefore не годится, потому что у меня есть org.dom4j.Node экземпляров, а не org.w3c.dom.Node экземпляров. OMG.

Не могли бы вы дать мне небольшой фрагмент кода, который выполняет эту работу для меня?

Вот что у меня сейчас:

// puts lr's to the very end in the xml, but I'd like to put them before 'e'
for(Element lr : loopResult) {
  e.getParent().add(lr);
}

1 Ответ

11 голосов
/ 10 октября 2011

Это «старый» вопрос, но ответ все еще может быть актуальным.Одна из проблем API DOM4J заключается в том, что существует слишком много способов сделать то же самое;слишком много удобных методов с тем эффектом, что вы не можете видеть лес за деревьями.В вашем случае вы должны получить список дочерних элементов и вставить ваш элемент в нужную позицию: что-то вроде этого (не проверено):

// get a list of e's sibling elements, including e
List elements = e.getParent().elements();
// insert new element at e' position, i.e. before e
elements.add(elements.indexOf(e), lr);

Списки в DOM4J являются живыми списками, то есть операция с мутирующим списком влияет надерево документа и наоборот

В качестве примечания, DOMElement и все другие классы в org.dom4j.dom - это реализация DOM4J, которая также поддерживает API-интерфейс w3c DOM.Это редко требуется (я бы не поместил его и кучу других «эзотерических» пакетов, таких как bean, datatype, jaxb, swing и т. Д., В один и тот же модуль распространения).Сконцентрируйтесь на основных пакетах org.dom4j, org.dom4j.tree, org.dom4j.io и org.dom4j.xpath.

...