是否可以将现有的xml架构映射到现有的java类?
我有几个xml架构,我需要将它们全部映射到一个java类。 Xml文件在存储数据方面略有不同。 E.g。
public class DataStorage {
public String data1;
public String data2;
public String data3;
}
和一组不同的xml文件
<?xml ...?>
<dataCase1>
<data1>...</data1>
<data2>...</data2>
<data3>...</data3>
</dataCase1>
<?xml ...?>
<dataCase2>
<data data1="..." data2="..." data3="..." />
</dataCase2>
<?xml ...?>
<dataCase3>
<data>
<innerData>
<data1>...</data1>
</innerData>
<otherData data2="...">
<data3>...</data3>
</otherData>
</data>
</dataCase3>
可能还有许多其他xml文件变种。
是否可以使用jaxb将所有文件绑定到java类?
答案 0 :(得分:2)
您可以使用JAXB的EclipseLink MOXy实现来实现此目的。据我所知,您仍然需要为不同类型的架构创建不同的类,但您可以重用您的域对象。
继续你的例子:
DataStorage
类包含3个域对象(data1
,data2
,data3
),简单地表示为Strings
,可以是任何JAXB映射域对象
架构类型1
@XmlRootElement(name = "dataCase")
@XmlAccessorType(XmlAccessType.FIELD)
public class DataStorage {
private String data1;
private String data2;
private String data3;
/**
* No-arg ctor needed by jaxb.
*/
private DataStorage() {}
public DataStorage(String data1, String data2, String data3) {
this.data1 = data1;
this.data2 = data2;
this.data3 = data3;
}
}
架构类型2 。请注意使用@XmlPath
注释。
@XmlRootElement(name = "dataCase")
@XmlAccessorType(XmlAccessType.FIELD)
public class DataStorage {
@XmlPath("data/@data1")
private String data1;
@XmlPath("data/@data2")
private String data2;
@XmlPath("data/@data3")
private String data3;
....
架构类型3 。再次利用@XmlPath
。
@XmlRootElement(name = "dataCase")
@XmlAccessorType(XmlAccessType.FIELD)
public class DataStorage {
@XmlPath("data/innerData/data1/text()")
private String data1;
@XmlPath("data/otherData/@data2")
private String data2;
@XmlPath("data/otherData/data3/text()")
private String data3;
....
编组
JAXBContext jc = JAXBContext.newInstance(DataStorage.class);
Marshaller marshaller = jc.createMarshaller();
DataStorage dataStorage = new DataStorage("data 1", "data 2", "data 3");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(dataStorage, System.out);
有关我的信息,请参阅MOXy团队负责人博客中的this post。
答案 1 :(得分:1)
您可以使用XSLT将不同的XML格式转换为统一的XML格式。