Генерация параметра атрибута в xml с использованием JAXB

Я должен сгенерировать следующий xml в своей программе, используя JAXB.

         <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Employee empId="12345">
          <name>ABC</name>
          <address type="Residence">Bangalore</address>
         </Employee>

Я должен сгенерировать вышеуказанный xml с помощью JAXB. У меня есть класс Employee следующим образом:

Класс сотрудников

    package mypack;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement (name = "Employee")
    public class Employee {
            private String name;
        private String address;
        private int empId;
        private String addressType;

        @XmlAttribute
        public int getEmpId() {
            return empId;
        }
        public void setEmpId(int empId) {
            this.empId = empId;
        }

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }

        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }

        public String getType() {
            return addressType;
        }
        public void setType(String addressType) {
            this.addressType = addressType;
        }   
    }

Я использую JAXB для маршалинга объекта.

Employee emp = new Employee();
            emp.setName("ABC");
            emp.setEmpId(12345);
                emp.setAddress("Bangalore");
                    emp.setType("Residence");
                    JAXBContext context = JAXBContext.newInstance(Employee.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.marshal(emp, System.out);

Он не генерирует требуемый xml. Вместо этого он генерирует xml следующим образом:

**Xml Being Generated**

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Employee empId="12345">
       <name>ABC</name>
       <address>Bangalore</address>
       <type>Residence</type>
    </Employee>

На самом деле я не знаю, как аннотировать атрибут типа, чтобы я сгенерировал xml как <address type="Resident">Bangalore</address> Должен ли мой класс Employee быть таким, как указано выше? Если да, то как аннотировать атрибут типа, чтобы он был атрибутом в теге <address>.

Пожалуйста, помогите мне.


person Surya    schedule 20.10.2011    source источник
comment
Думали ли вы о создании схемы и использовании XJC для создания класса Java? В вашей схеме вы можете настроить все необходимые атрибуты и значения.   -  person John B    schedule 20.10.2011
comment
Схема будет полезна, если я создаю классы Java из xml. Но мое требование заключается в том, что я должен сгенерировать xml, как указано, из объектов Java. Я имею в виду java в xml, а не наоборот. И мне не нужно беспокоиться о xml, потому что в моем случае для xml не требуется иметь схему с ним. Спасибо   -  person Surya    schedule 20.10.2011
comment
К вашему сведению, схему можно использовать, если вы идете в любом направлении. Даже если он мне не нужен, я считаю полезным использовать схему для определения формата XML и позволить XJC создать для меня соответствующий JaxB класс Java. Мне кажется, это проще, чем самому писать материал для JaxB. Это только я, хотя.   -  person John B    schedule 20.10.2011
comment
Я согласен. Но у меня нет файла xsd, чтобы я мог использовать его для создания классов Java. У меня ничего нет на самом деле. Мое требование состоит в том, чтобы создать файл xml в соответствии с указанным выше форматом. Как я могу продолжить? Еще раз спасибо.   -  person Surya    schedule 20.10.2011
comment
Это моя точка зрения. Создайте файл xsd и позвольте ему создавать классы Java, а не выполнять работу по созданию классов самостоятельно. У вас есть выбор: вы можете либо выполнить работу по созданию классов вручную, либо выполнить работу по созданию xsd и позволить XJC создать классы из xsd. Лично я, учитывая требование создать файл xml определенного формата, предпочел бы потратить усилия на создание файла xsd.   -  person John B    schedule 20.10.2011
comment
Вы абсолютно правы. На самом деле мой подход был неправильным. Кстати, если бы вы хотели, чтобы кто-то пошел по вашему пути, что бы вы предложили? Я понимаю xsd, но мне очень неудобно писать файл xsd самостоятельно. Предложите ли вы какой-либо инструмент для этого или достаточно опыта работы с xsd?   -  person Surya    schedule 20.10.2011
comment
Вы можете использовать Eclipse для визуального создания схемы, поэтому вам не нужно знать все о схемах, чтобы написать схему, которая будет работать на вас. Создайте новую схему и добавьте типы и элементы. Используйте окно свойств для изменения различных атрибутов.   -  person John B    schedule 21.10.2011
comment
В моем веб-приложении я получаю содержимое xml (без xsd ) из некоторых других служб за пределами моего веб-приложения. Моя работа состоит в том, чтобы извлечь из него значения с помощью JAXB. Должен ли я продолжить написание xsd для xml, который я получаю, а затем использовать инструмент xjc для получения конкретных классов jaxb и, наконец, использовать сгенерированные классы в моем веб-приложении? Правильно ли я понимаю?   -  person Surya    schedule 21.10.2011
comment
Вот как бы я это сделал. Что не означает, что это обязательно правильный путь.   -  person John B    schedule 21.10.2011


Ответы (1)


person    schedule
comment
Мне нужно сгенерировать xml из java с помощью JAXB. Разве нельзя добиться результата с помощью простого пакета javax.xml.bind? Я имею в виду без использования какой-либо другой библиотеки. - person Surya; 20.10.2011
comment
@Surya - Можете ли вы изменить свою объектную модель и ввести второй класс для представления адресной информации? - person bdoughan; 20.10.2011
comment
Да, я могу. Но каким должен быть мой второй класс? Если атрибут имеет сложный тип, например «Сотрудник» выше, я могу легко продолжить работу с ним. Но атрибут, который вызывает у меня проблемы, — это тип тега «адрес», который является простым тегом (без вложенного тега внутри него). Не могли бы вы объяснить подробнее, как действовать? - person Surya; 20.10.2011
comment
@Surya - я обновил свой ответ, указав, как будет выглядеть новая модель. - person bdoughan; 20.10.2011
comment
Это сработало. Большое спасибо. Основной тег, который я не мог придумать, это @XmlValue во втором классе модели. В любом случае, спасибо за ответы на все мои вопросы. Я надеюсь, что мы не сможем создать тот же XML, не создав для этого другой класс модели. Я прав? - person Surya; 20.10.2011
comment
@Surya - Используя стандартные API JAXB, вам понадобится класс Address. Если вы используете расширение @XmlPath из EclipseLink MOXy, вам не нужен класс Address. - person bdoughan; 20.10.2011
comment
В порядке. Я буду использовать EclipseLink MOXy при каждом удобном случае. Большое спасибо еще раз. - person Surya; 20.10.2011