使用jaxb创建等效输出

时间:2015-01-19 23:32:01

标签: java xml jaxb marshalling unmarshalling

我正在为客户做一个项目,我必须阅读XML文件,分析它们,在需要时进行一些修正并再次写出来。 我使用JAXB来解决这个问题,只需解组文件,处理生成的对象,并在完成后将对象编组回文件。

可悲的是,我的客户要求不要更改XML文件,除了我的程序故意更改的部分。 这会导致麻烦,因为JAXB在编组时会更改XML文件,例如通过更改属性的顺序或将命名空间的定义移动到XML结构的根元素。

我是否有可能更改JAXB marshaller的输出以符合我的客户的期望?或者,如果使用JAXB无法实现这一点,那么Java是否有可以保留XML文件的替代XML库? 我目前正在尝试使用DOM和SAX,但让它们像我想要的那样工作似乎是一件很麻烦的事。

1 个答案:

答案 0 :(得分:0)

JAXB的Binder机制可能符合您的要求。如果Marshaller生成新的XML文档,Binder会将更改应用回用作输入的DOM

import java.io.File;
import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;

public class BinderDemo {

    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        File xml = new File("input.xml");
        Document document = db.parse(xml);

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

        Binder<Node> binder = jc.createBinder();
        Customer customer = (Customer) binder.unmarshal(document);
        customer.getAddress().setStreet("2 NEW STREET");
        PhoneNumber workPhone = new PhoneNumber();
        workPhone.setType("work");
        workPhone.setValue("555-WORK");
        customer.getPhoneNumbers().add(workPhone);
        binder.updateXML(customer);

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        t.transform(new DOMSource(document), new StreamResult(System.out));
    }

}

了解更多信息

我在博客上写了更多关于JAXB&#39; Binder的信息: