这是另一个解决方案,使用XOM library,与my dom4j answer 竞争。 (这是我的quest to find a good dom4j replacement 的一部分,其中建议将 XOM 作为一种选择。)
首先将XML片段读入nu.xom.Document:
String newNode = "<node>value</node>"; // Convert this to XML
Document newNodeDocument = new Builder().build(newNode, "");
然后,获取添加片段的文档和节点。同样,出于测试目的,我将从字符串创建文档:
Document originalDoc = new Builder().build("<root><given></given></root>", "");
Element givenNode = originalDoc.getRootElement().getFirstChildElement("given");
现在,添加子节点很简单,与 dom4j 类似(除了 XOM 不允许添加已经属于 newNodeDocument 的原始根元素):
givenNode.appendChild(newNodeDocument.getRootElement().copy());
输出文档会产生正确的 XML 结果(使用 XOM 非常容易:只需打印 originalDoc.toXML() 返回的字符串):
<?xml version="1.0"?>
<root><given><node>value</node></given></root>
(如果您想很好地格式化 XML(带有缩进和换行符),请使用 Serializer;感谢 Peter Štibraný 指出这一点。)
所以,诚然,这与 dom4j 解决方案没有太大区别。 :) 但是,使用 XOM 可能会更好一些,因为 API 有更好的文档记录,并且因为它的设计理念是每件事都有一个规范的方法。
附录:再次说明如何在org.w3c.dom.Document 和nu.xom.Document 之间进行转换。使用 XOM 的 DOMConverter 类中的辅助方法:
// w3c -> xom
Document xomDoc = DOMConverter.convert(w3cDoc);
// xom -> w3c
org.w3c.dom.Document w3cDoc = DOMConverter.convert(xomDoc, domImplementation);
// You can get a DOMImplementation instance e.g. from DOMImplementationRegistry