jaxb с существующими классами и схемой - PullRequest
3 голосов
/ 05 сентября 2011

Можно ли отобразить существующую 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-файлов.

Возможно ли связать все эти файлыJava-класс с использованием Jaxb?

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Вы можете использовать реализацию 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;
    ....
    
  • Marshalling

    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 для меня информация.

1 голос
/ 16 февраля 2012

Вы можете использовать XSLT для перевода ваших различных форматов XML в один унифицированный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...