这可能是最简单的事情之一,但由于某些原因不适合我。我正在尝试在dom树中的根之后添加一个新节点 这是原始字符串:
<div class="discussionThread dt"><div class="dt_subject">2011 IS HERE!</div></div>
我正在尝试添加一个以字符串形式出现的新节点。最终版本应如下所示:
<div class="discussionThread dt"><div class="test">Test Val</div><div class="dt_subject">2011 IS HERE!</div></div>
如您所见,新的 Test Val 正在根div类之后立即添加。我使用了一些方法将节点放在正确的位置,但最后会附加它。
以下是我之前发布过的一篇文章:
String newNode = "<div class="test">test</div>";
SAXReader reader = new SAXReader();
Document newNodeDocument = reader.read(new StringReader(newNode));
Document originalDoc = new SAXReader().read(new StringReader(content));
Element root = originalDoc.getRootElement();
Element givenNode = originalDoc.getRootElement();
givenNode.add(newNodeDocument.getRootElement());
这导致节点最后添加。我尝试使用insertBefore(),但没有成功。
任何指针都将受到高度赞赏。
谢谢
答案 0 :(得分:3)
为什么要创建新的Document
或新的根Element
?我认为最短的方法是使用Branch#content
:
返回此内容节点 分支作为支持列表,以便 这个分支的内容可能是 直接使用界面修改。 列表由分支机构支持 反映了对列表的更改 在分支机构,反之亦然。
您只需创建新元素并通过List
方法提供的content
将其添加到根元素(将位置索引传递给它),这是我的主要内容:
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
String xml = "<div class=\"discussionThread dt\"><div class=\"dt_subject\">2011 IS HERE!</div></div>";
Document document = reader.read(new StringReader(xml));
DefaultElement newElement = new DefaultElement("div");
newElement.addAttribute("class", "test");
newElement.add(new DefaultText("Test Val"));
List content = document.getRootElement().content();
if (content != null ) {
content.add(0, newElement);
}
System.out.println(document.asXML());
}
打印出以下xml:
<div class="discussionThread dt"><div class="test">Test Val</div><div class="dt_subject">2011 IS HERE!</div></div>
此外,在必须转换xml时,还应考虑使用xslt。
答案 1 :(得分:2)
您正在呼叫Element#add(Entity)
。来自Javadocs:
将给定的
Entity
添加到此元素。如果给定节点已经定义了父节点,那么将抛出IllegalAddException
。
因此,您添加的新节点将添加为您要添加的节点的子。您不能在根节点之后添加另一个节点,因为文档只能有一个根节点。
您可以做的是创建一个新的根节点,然后将旧的根节点和新节点添加为此新根节点的子节点。然后将文档的根节点设置为新的根节点。
答案 2 :(得分:1)
为什么不用你想要的值创建一个新文档,然后将其他节点附加到它?