在dom树中的第一个子节点之前添加新节点

时间:2011-04-06 19:39:16

标签: java xml dom4j

这可能是最简单的事情之一,但由于某些原因不适合我。我正在尝试在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(),但没有成功。

任何指针都将受到高度赞赏。

谢谢

3 个答案:

答案 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)

为什么不用你想要的值创建一个新文档,然后将其他节点附加到它?