我正在为客户做一个项目,我必须阅读XML文件,分析它们,在需要时进行一些修正并再次写出来。 我使用JAXB来解决这个问题,只需解组文件,处理生成的对象,并在完成后将对象编组回文件。
可悲的是,我的客户要求不要更改XML文件,除了我的程序故意更改的部分。 这会导致麻烦,因为JAXB在编组时会更改XML文件,例如通过更改属性的顺序或将命名空间的定义移动到XML结构的根元素。
我是否有可能更改JAXB marshaller的输出以符合我的客户的期望?或者,如果使用JAXB无法实现这一点,那么Java是否有可以保留XML文件的替代XML库? 我目前正在尝试使用DOM和SAX,但让它们像我想要的那样工作似乎是一件很麻烦的事。
答案 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
的信息: