具有现有类和模式的jaxb

时间:2011-09-05 19:09:54

标签: java xml jaxb

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

2 个答案:

答案 0 :(得分:2)

您可以使用JAXB的EclipseLink MOXy实现来实现此目的。据我所知,您仍然需要为不同类型的架构创建不同的类,但您可以重用您的域对象。

继续你的例子:

DataStorage类包含3个域对象(data1data2data3),简单地表示为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格式。