我有两个XML文件file1.xml
和file2.xml
。我还尊重每个文件file1.xsd
和file2.xsd
的模式。
我使用xjc
创建基于file1.xsd
的java类(称为model(1)),并基于file2.xsd
创建类(称为model(2))。
我使用model(1)来解析file1.xml和JAXB
库。我想将此数据从模型(1)转换为模型(2),然后将转换后的数据封送到file2.xml
是否可以将数据从模型(1)转换为模型(2)?我可以合并ObjectFactories
吗?我该怎么做?
答案 0 :(得分:5)
鉴于您的用例,无法自动从一个XML架构生成的JAXB (JSR-222)模型转换为另一个XML架构生成的另一个JAXB模型。有几个选择:
选项#1 - 对象到对象转换
您可以以编程方式在对象模型之间移动数据。还有一些映射库可以使这个过程更容易(http://dozer.sourceforge.net/)。
选项#2 - XSLT
XSLT是基于一组规则将一个XML文档转换为另一个XML文档的标准。通过使用JAXBSource
和JAXBResult
,您甚至可以在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。