2011-04-06 67 views
1

这可能是处理这些最简单的事情之一,但由于某种原因不适合我。我试图在dom树的根后添加一个新节点。
这里的原始字符串:在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> 

正如你可以看到,新的测试瓦尔被立即根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(),但没有解决。

任何指针将不胜感激。

谢谢

+2

你能告诉我们你到目前为止尝试过的吗?如果不查看代码,很难说出错。 – 2011-04-06 19:41:39

+0

只需添加示例代码供您参考。 – Shamik 2011-04-06 20:02:13

+0

你在使用什么库? DOM4J? – 2011-04-06 20:11:47

回答

3

为什么要创建新的Document或新的根Element?我想在最短的方法是使用Branch#content

返回此 分支的内容节点的支持列表中,使 这一分支的内容可能是 直接使用界面进行修改。 该列表由分支支持,所以 更改为列表的列表在分支中反映为 ,反之亦然。

你只需要创建新元素,并通过content方法(通过它的位置索引)所提供的List将其添加到根元素,这是我的主:

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> 

此外,你也应该考虑使用XSLT时,你必须转换XML。

+0

非常感谢解决方案。这与我所寻找的非常接近。它确实在预期位置添加了新元素。这里的问题是你明确地创建一个新的元素并设置必要的属性和文本值。在我的情况下,我需要插入的数据作为字符串参数传递给我的程序。该值可以是单个div或多个div捆绑在一起。对于例如

Test Val1
Test Val2
。我在考虑是否可以在根元素 – Shamik 2011-04-06 23:24:27

+0

@Shamik之后添加整个字符串内容如果您想添加作为字符串接收的整个xml片段,您只需将其解析为xml,但字符串必须很好形成了xml。不幸的是,您的示例字符串没有唯一的根元素,但是两个兄弟节点...并且文档只能有一个根节点。 – javanna 2011-04-07 22:27:00

2

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

将给定的Entity添加到此元素。如果给定节点已经定义了父节点,则会抛出IllegalAddException

所以你添加新的节点将被添加为孩子你将它添加到节点的。您不能在根节点之后添加另一个节点,因为文档只能有一个根节点。

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

1

为什么不只是创建一个具有所需值的新文档,然后将其他节点附加到它?

相关问题