是否可以将现有的xml模式映射到现有的java类?
我有几种xml模式,我需要将它们全部映射到一个java类. Xml文件在存储数据的方式上有些不同.
例如.
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类?
解决方法:
您可以使用JAXB的EclipseLink MOXy实现来实现.据我了解,您仍然必须为不同类型的架构创建不同的类,但是您可以重用域对象.
继续您的示例:
具有3个域对象(data1,data2,data3)的DataStorage类(简单地表示为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.