2011-04-06 100 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

爲什麼不只是創建一個具有所需值的新文檔,然後將其他節點附加到它?

相關問題