编组xml文件时到底发生了什么

时间:2011-11-09 09:03:25

标签: java xml jaxb

假设我有一个xml文件,它有几个节点&儿童。我正在使用jaxb(解组和编组)在需要时更新xml文件,但想知道.........

时到底发生了什么?
<parent>
    <node>abc</node>
</parent>

现在我想通过添加<node>xyz</node>来更新这个xml,所以我要做什么

  1. 将此xml文件解包为java Object,并将此新节点添加为java对象。

  2. 将更新后的对象转换为XML文件。

  3. 我的问题是:当我们将java对象编组为xml文件时会发生什么?

    选项a)xml文件删除所有内容并重新写入。

    选项b)仅通过添加新行来更新xml文件。

2 个答案:

答案 0 :(得分:2)

默认情况下会覆盖内容。

仅当您使用m.marshal(jaxbObj, new FileOutputStream(file, true))(append = true)时,才会追加新内容。

答案 1 :(得分:1)

如果您严格谈论File个对象,那么answer given by Bozho是正确的。如果考虑DOM表示,那么JAXB提供两种方法:

<强>的Unmarshaller /的Marshaller

在以下代码originalDOM!= marshalledDOM。

Node originalDOM;  // Populate original document

JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Customer customer = (Customer) unmarshaller.unmarshal(orginalDocument);

Marshaller marshaller = jc.createMarshaller();
marshalledDOM = marshaller.getNode(customer);

<强>夹

当使用Binder时,在对象和DOM节点之间保持链接,它们被解组。如果修改了unmarshalled对象,则Binder会将这些更改应用回原始DOM。当您需要保留文档中未映射的内容(例如注释和处理说明)时,此方法非常有用。

    JAXBContext jc = JAXBContext.newInstance(Customer.class);

    Binder<Node> binder = jc.createBinder();
    Customer customer = (Customer) binder.unmarshal(document);
    customer.getAddress().setStreet("2 NEW STREET");
    binder.updateXML(customer);

了解更多信息