2012-01-24 103 views
1

我的XML文件是這樣的:如何在使用dom的XML文件中追加元素?

<Messages> 
    <Contact Name="Robin" Number="8775454554"> 
     <Message Date="24 Jan 2012" Time="04:04">this is report1</Message> 
    </Contact> 
    <Contact Name="Tobin" Number="546456456"> 
     <Message Date="24 Jan 2012" Time="04:04">this is report2</Message> 
    </Contact> 
<Messages> 

我需要檢查接觸元件的「數字」屬性是否等於「somenumber」,如果是,我需要插入一個多個消息元素內部聯繫人元素。

如何使用DOM實現?使用DOM的缺點是什麼?

回答

4

主要缺點使用DOM是什麼,有必要加載整個模型進入內存,而不是如果您簡單地解析文檔,您可以限制您保存在內存中的數據在一個點上。在處理非常大的XML文檔之前,這當然不是真正的問題。

至於事情的處理方面,像下面應該工作:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document dom = db.parse(is); 
NodeList contacts = dom.getElementsByTagName("Contact"); 
for(int i = 0; i < contacts.getLength(); i++) { 
    Element contact = (Element) contacts.item(i); 
    String contactNumber = contact.getAttribute("Number"); 
    if(contactNumber.equals(somenumber)) { 
     Element newMessage = dom.createElement("Message"); 
     // Configure the message element 
     contact.appendChild(newMessage); 
    } 
} 
1

你會爲此做一些事情。

  • 獲取Contact元件的NodeList
  • 迭代通過NodeList並獲得Contact元素。
  • 獲取Numbercontact.getAttribute("Number")其中contactElement類型。
  • 如果您的號碼等於someNumber,然後通過調用contact.appendChild()添加MessageMessage必須是一個元素。
1

使用元素類來創建一個新的元素

Element message = doc.createElement("Message"); 
message.setAttribute("message", strMessage); 

現在,添加這個元素你想使用

elem.getParentNode().insertBefore(message, elem.getNextSibling()); 
2

DOM主要有兩個缺點:

  • 它需要完整的XML讀入一個Java表示記憶。這既可以是時間和內存消耗
  • 這是一個非常詳細的API,所以你需要編寫大量的代碼來實現簡單的事情,就像你問的。

如果時間和內存消耗是你不錯,但冗長不是,你仍然可以使用jOOX,我已經創建了包裝標準的Java DOM對象來簡化XML的操作庫。這些是你將如何與jOOX實現您的要求的一些例子:

// With css-style selectors 
String result1 = $(file).find("Contact[Number=somenumber]").append(
    $("<Message Date=\"25 Jan 2012\" Time=\"23:44\">this is report2</Message>") 
).toString(); 

// With XPath 
String result2 = $(file).find("//Contact[@Number = somenumber]").append(
    $("<Message Date=\"25 Jan 2012\" Time=\"23:44\">this is report2</Message>") 
).toString(); 

// Instead of file, you can also provide your source XML in various other forms 

注意jOOX只有包裝標準的Java DOM。底層操作(find()append()以及$()實際上執行各種DOM操作)。

相關問題