【问题标题】:Creating equivalent output with jaxb使用 jaxb 创建等效输出
【发布时间】:2015-01-19 23:32:01
【问题描述】:

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

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

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

【问题讨论】:

  • 属性顺序无关紧要,因此不支持对其进行控制,请参阅community.oracle.com/thread/977397
  • 问题不在于工具,而在于更多的 XML 本身。对于同一个文档,允许有许多不同的表示(对于空节点、空格等)。对客户来说最便宜的方法是给他培训。

标签: java xml jaxb marshalling unmarshalling


【解决方案1】:

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 的 Binder

【讨论】:

  • 哇,这是 JAXB 的一个非常酷的特性。唯一的问题是 DOM 中的数据不足以满足我的要求。 DOM 仍然会改变一些东西,比如属性的顺序。还是我在这里缺少 DOM 的一个功能,可以让我保持顺序固定?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多