【问题标题】:jaxb with existing classes and schema具有现有类和模式的 jaxb
【发布时间】:2012-02-16 14:34:12
【问题描述】:

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

【问题讨论】:

  • 是的,你可以。为每个 xml-schema 构建包并将它们绑定到您的类。
  • 能不能详细描述一下?

标签: java xml jaxb


【解决方案1】:

您可以使用 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 - 您还可以使用 MOXy 的 XML 元数据文件将多个映射应用到您的域模型。示例见:stackoverflow.com/questions/6838882/…
  • @Blaise 看起来很棒。这将在一段时间内派上用场:)
  • 这是一个更详细的示例,我将其放在一起展示了单个对象模型上的多个映射:blog.bdoughan.com/2011/09/…
【解决方案2】:

您可以使用 XSLT 将不同的 XML 格式转换为一个统一的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多