Задать вопрос
Ответы пользователя по тегу Java
  • Как правильнее указывать атрибуты для тегов в JAXB?

    VDT2
    @VDT2 Автор вопроса
    Java
    И так РЕШЕНИЕ ЗАДАЧИ.
    ДАНО:
    <?xml version="1.0" encoding="UTF-8"?>
    <types>
        <type name="Бинт">
            <nominal>5</nominal>
            <category name="медикаменты"/>
        </type>    
    </types>


    Для того, чтобы использовать аннтацию "name" для тега category который является вложенным в тег с аннотацией , нужно создавать для такого тега (category) отдельный класс

    class Category
    public class Category
    {
        private String name;
    
        public String getName ()
        {
            return name;
        }
        
        @XmlAttribute(name = "name") //добавили аннотацию name ( name="медикаменты")
        public void setName (String name)
        {
            this.name = name;
        }
    }


    class Type
    public class Type
    {
        private String nominal;
    
        private String name;
    
        private Category category;
    
        public String getNominal ()
        {
            return nominal;
        }
    
        public void setNominal (String nominal)
        {
            this.nominal = nominal;
        }
    
        public String getName ()
        {
            return name;
        }
        @XmlAttribute(name = "name") //атрибут NAME для имени тега type (name="Бинт")
        public void setName (String name)
        {
            this.name = name;
        }
    
        public Category getCategory ()
        {
            return category;
        }
    
        public void setCategory (Category category)
        {
            this.category = category;
        }
    }


    class Types
    @XmlSeeAlso({Type.class})
    @XmlRootElement( name = "types" )
    public class Types
    {
    
        List<Type> types;
    
        public List<Type> gettypes()
        {
            return types;
        }
    
        /**
         * element that is going to be marshaled in the xml
         */
        @XmlElement( name = "type" )
        public void settypes( List<Type> types )
        {
            this.types = types;
        }
    
        /**
         * This method is not used by jaxb, just used for business reasons. In the case that this class
         * would be generated using xml schemas definitions, this method has to be added to the
         * generated class or to some helper or util one
         *
         * @param Type
         */
        public void add( Type Type )
        {
            if( this.types == null )
            {
                this.types = new ArrayList<Type>();
            }
            this.types.add( Type );
    
        }
    
        @Override
        public String toString()
        {
            StringBuffer str = new StringBuffer();
            for( Type museum : this.types )
            {
                str.append( museum.toString() );
            }
            return str.toString();
        }
        
    }


    Далее магия маршалинга. Теперь чтобы эту дичь запаковать нужно в main class сделать следующее

    Category category = new Category(); //Создали объект Категории для объекта type
                category.setName("медикаменты"); //Прописали атрибут
    
                Type type = new Type(); //Создаем объект TYPE.
                type.setName("Бинт"); //Прописываем ему имя
                type.setNominal("5"); // какие то данные в тег Nominal
                type.setCategory(category); // добавили ссылку на объект Категории
    
                Types types = new Types(); // создали "основной" объект
                 types.add(type);  // положили в него все объекты типа Тайп (у нас он один)
    //             types.add(type2);  // так добавляем еще типы.
    
                JAXBContext jaxbContext = JAXBContext.newInstance( Types.class); //Указываем только "корневой" класс. Тот что самый верхний в иерархии (куда мы все и сложили)
                Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
                
                jaxbMarshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
    
                jaxbMarshaller.marshal( types, new File( "test.xml" ) ); //сохранили в файл
                jaxbMarshaller.marshal( types, System.out ); //показали в консоли чего там в файл сохранили.


    Готово.
    p.s. Дожили. Я пишу инструкции и примеры кода. А жизнь то меняется....)))
    p.p.s. Изменил код class Types. Там была ошибка приводящая не корректному результату при маршалинге.
    Ответ написан
    Комментировать