假设我有一个xml文件,它有几个节点&儿童。我正在使用jaxb(解组和编组)在需要时更新xml文件,但想知道.........
时到底发生了什么?<parent>
<node>abc</node>
</parent>
现在我想通过添加<node>xyz</node>
来更新这个xml,所以我要做什么
将此xml文件解包为java Object,并将此新节点添加为java对象。
将更新后的对象转换为XML文件。
我的问题是:当我们将java对象编组为xml文件时会发生什么?
选项a)xml文件删除所有内容并重新写入。
选项b)仅通过添加新行来更新xml文件。
答案 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);
了解更多信息