Java-具有现有类和架构的jaxb

是否可以将现有的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.

上一篇:【一起学源码-微服务】Nexflix Eureka 源码三:EurekaServer启动之EurekaServer上下文EurekaClient创建


下一篇:11-8 Eureka Server整合SpringSecurity解决安全问题