我可以将当​​前的JAXB模型转换为其他JAXB模型吗?

时间:2012-11-08 12:27:59

标签: java xml xsd jaxb xjc

我有两个XML文件file1.xmlfile2.xml。我还尊重每个文件file1.xsdfile2.xsd的模式。

我使用xjc创建基于file1.xsd的java类(称为model(1)),并基于file2.xsd创建类(称为model(2))。

我使用model(1)来解析file1.xml和JAXB库。我想将此数据从模型(1)转换为模型(2),然后将转换后的数据封送到file2.xml

是否可以将数据从模型(1)转换为模型(2)?我可以合并ObjectFactories吗?我该怎么做?

2 个答案:

答案 0 :(得分:5)

鉴于您的用例,无法自动从一个XML架构生成的JAXB (JSR-222)模型转换为另一个XML架构生成的另一个JAXB模型。有几个选择:

选项#1 - 对象到对象转换

您可以以编程方式在对象模型之间移动数据。还有一些映射库可以使这个过程更容易(http://dozer.sourceforge.net/)。

选项#2 - XSLT

XSLT是基于一组规则将一个XML文档转换为另一个XML文档的标准。通过使用JAXBSourceJAXBResult,您甚至可以在Java模型上使用XSLT。

TransformerFactory tf = TransformerFactory.newInstance();
StreamSource xslt = new StreamSource(new FileInputStream("my-xslt.xml"));
Transformer t = tf.newTransformer(xslt);

JAXBContext jc = JAXBContext.newInstance(MyClass.class);
JAXBSource source = new JAXBSource(jaxbContext1, foo);
JAXBResult result = new JAXBResult(jaxbContext2);
t.transform(source, result);
Bar bar = (Bar) result.getResult();

选项#3 - EclipseLink JAXB(MOXy)的外部映射文件

我是MOXy的主角,我们提供了一个外部映射文件,允许您将对象模型映射到多个XML表示。请参阅以下链接以获取示例:

答案 1 :(得分:2)

我不确定我理解这个问题 - 我认为你需要的是在你的Model2类上添加一个构造函数,它接受一个Model1类作为参数。

举个例子,假设这是你的Model1类:

class Model1{
    String firstname;
    String surname;

}

class Model2{
    String fullName
    public Model2(Model1 m){
        this.fullname=m.firstname+" "+m.surname;
    }
}

即在该构造函数内部,将属性的值从m复制到Model2实例

之后,您可以在Model1和Model2之间进行转换:

Model1 m1=unmarshall("file1.xml");
Model2 m2=new Model2(m1);
m2.marshall("file2.xml");

如果您只是为了在xml格式之间进行转换,我建议您改用XSLT