JAXB Unmarshalling список

1

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

У меня есть 2 класса элементов, класс и элемент Студент. Я смоделировал их на Java, как показано ниже:

@XmlRootElement(name = "classroom", namespace = "http://www.info.com/school/model")
@XmlAccessorType(XmlAccessType.FIELD)
public class Classroom {
    @XmlElementWrapper(name = "students")
    @XmlElement(name = "student", type = Student.class)
    private List<Student> students;

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }   
}

@XmlAccessorType(XmlAccessType.FIELD)
public class Student {
    private String name;
    private String gender;
    private Integer age;

    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }   
}

Когда я пытаюсь развязать классный элемент, он не может развязать список учеников. Например, следующий код должен распечатываться в System out "Number of Pupils is: 2", но когда я его запускаю, я получаю "Number of Pupils is: 0".

Кто-нибудь может указать мне в правильном направлении для настройки аннотаций JAXB, чтобы я мог его отменить?

Я даже добавил вызов метода toString в контексте JAXB, и я вижу, что также указан класс Student.

public static void main(String[] args) {
        SimpleJaxbTestForLists sjtfl = new SimpleJaxbTestForLists();
        sjtfl.unmarshal("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><classroom xmlns=\"http://www.info.com/school/model\"><students><student><name>Test Student 1</name><gender>Male</gender><age>12</age></student><student><name>Test Student 2</name><gender>Female</gender><age>12</age></student></students></classroom>");

    }

    public void unmarshal(String xmlContent) {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Classroom.class);

            System.out.println(jaxbContext.toString());
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();


            StringReader reader = new StringReader(xmlContent);
            Classroom classroom = (Classroom) jaxbUnmarshaller.unmarshal(reader);

            System.out.println("Number of Pupils is: " + classroom.getStudents().size());
        } catch (JAXBException ex) {
            ex.printStackTrace();
        }
    }
Теги:
jaxb

1 ответ

1
Лучший ответ

Поскольку ваш XML-документ указывает пространство имен по умолчанию, вы можете использовать аннотацию @XmlSchema уровне @XmlSchema для сопоставления квалификации пространства имен:

package-info.java

@XmlSchema(
    namespace = "http://www.info.com/school/model",
    elementFormDefault = XmlNsForm.QUALIFIED)
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Чтобы получить больше информации

Вы можете узнать больше о JAXB и квалификации пространства имен в моем блоге:

  • 0
    Я недавно узнал из этого блога :)
  • 0
    @prash - Понятно, как вам нужно использовать package-info.java ?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню