如何使用dom将元素附加到XML文件中?

时间:2012-01-24 13:41:46

标签: java 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>

我需要检查Contact元素的'Number'属性是否等于'somenumber',如果是,我需要在Contact元素中插入一个Message元素。

如何使用DOM实现?使用DOM会有什么缺点?

5 个答案:

答案 0 :(得分:5)

使用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 :(得分: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操作。)

答案 2 :(得分:1)

你会为此做点什么。

  • 获取NodeList元素的Contact
  • 遍历NodeList并获取Contact元素。
  • 获取Number contact.getAttribute("Number") contact类型Element。{/ li>
  • 如果您的号码等于someNumber,请致电Message添加contact.appendChild()Message必须是元素。

答案 3 :(得分:1)

使用Element类创建新元素

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

现在使用

添加任何元素之后添加此元素
elem.getParentNode().insertBefore(message, elem.getNextSibling());

答案 4 :(得分:0)

你可能想看一下this tutorial关于你想要做什么