1

我有两个 XML 文件file1.xmlfile2.xml. 我也有每个这些文件的模式,file1.xsd并且file2.xsd恭敬地。

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

我使用 model(1) 将 file1.xml 与JAXB库解组。我想将此数据从模型(1)转换为模型(2),然后将转换后的数据编组为file2.xml

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

4

2 回答 2

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 表示。有关示例,请参见下面的链接:

于 2012-11-08T14:10:42.953 回答
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

于 2012-11-08T13:27:49.513 回答