Для чего стоит, вот решение, которое я придумал, используя библиотеку dom4j . (Я проверял, что это работает.)
Считайте фрагмент XML в org.dom4j.Document
(примечание: все используемые ниже классы XML взяты из org.dom4j; см. Приложение):
String newNode = "<node>value</node>"; // Convert this to XML
SAXReader reader = new SAXReader();
Document newNodeDocument = reader.read(new StringReader(newNode));
Затем получите Документ, в который вставлен новый узел, и родительский Элемент (который будет) из него. (Ваш org.w3c.dom.Document необходимо преобразовать в org.dom4j.Document здесь.) Для целей тестирования я создал такой как:
Document originalDoc =
new SAXReader().read(new StringReader("<root><given></given></root>"));
Element givenNode = originalDoc.getRootElement().element("given");
Добавить новый дочерний элемент очень просто:
givenNode.add(newNodeDocument.getRootElement());
Готово. Вывод originalDoc
теперь дает:
<?xml version="1.0" encoding="utf-8"?>
<root>
<given>
<node>value</node>
</given>
</root>
Приложение : поскольку в вашем вопросе говорится о org.w3c.dom.Document
, вот как можно конвертировать между этим и org.dom4j.Document
.
// dom4j -> w3c
DOMWriter writer = new DOMWriter();
org.w3c.dom.Document w3cDoc = writer.write(dom4jDoc);
// w3c -> dom4j
DOMReader reader = new DOMReader();
Document dom4jDoc = reader.read(w3cDoc);
(Если вам регулярно требуются оба вида Document
, возможно, имеет смысл поместить их в аккуратные служебные методы, возможно, в класс с именем XMLUtils
или что-то в этом роде.)
Может быть, есть лучшие способы сделать это, даже без каких-либо сторонних библиотек. Но из представленных решений, на мой взгляд, это самый простой способ, даже если вам нужно выполнить преобразования dom4j <-> w3c.
Обновление (2011): перед добавлением зависимости dom4j в ваш код, обратите внимание, что это , а не активно поддерживаемый проект, и с некоторыми другими проблемами тоже, Усовершенствованная версия 2.0 работала целую вечность, но доступна только альфа-версия. Возможно, вы захотите рассмотреть альтернативу, например, XOM; читайте больше в вопросе, связанном выше.