1

这可能是最容易处理的事情之一,但由于某种原因对我不起作用。我正在尝试在 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(),但没有成功。

任何指针将不胜感激。

谢谢

4

3 回答 3

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。

于 2011-04-06T21:57:04.803 回答
2

你在打电话Element#add(Entity)。来自 Javadocs:

将给定添加Entity到此元素。如果给定节点已经定义了一个父节点,那么IllegalAddException将抛出一个。

因此,您要添加的新节点将作为您要添加到的节点的节点添加。您不能在拥有的根节点之后添加另一个节点,因为一个文档只能有一个根节点。

您可以做的是创建一个新的根节点,然后将旧根节点和新节点添加为这个新根节点的子节点。然后将文档的根节点设置为新的根节点。

于 2011-04-06T19:43:59.010 回答
1

为什么不直接用你想要的值创建一个新的 Document,然后将其他节点附加到它上面呢?

于 2011-04-06T19:47:05.250 回答