2012-01-24 97 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操作)。

相关问题