0

I have an xml structure as follows:

<?xml version="1.0" encoding="UTF-8"?>

<school>
    <students>
        <student>
            <firstName>A</firstName>
            <id>1</id>
            <lastName>C</lastName>
            <company>BCD</company>
            <responsibilities>
                <responsibility>Leader</responsibility>
                <responsibility>Dancer</responsibility>
                <responsibility>Reporter</responsibility>
            </responsibilities>
        </student>
        <student>
            <firstName>B</firstName>
            <id>2</id>
            <lastName>C</lastName>
            <company>EFG</company>
            <responsibilities>
                <responsibility>Singer</responsibility>
            </responsibilities>
        </student>
    </students>
    <Teachers>
        <Teacher>
            <firstName>A</firstName>
            <lastName>C</lastName>
            <responsibilities>
                <responsibility>English</responsibility>
                <responsibility>Hindi</responsibility>
                <responsibility>Softskills</responsibility>
            </responsibilities>
        </Teacher>
        <Teacher>
            <firstName>A</firstName>
            <lastName>C</lastName>
            <company>BCD</company>
            <responsibilities>
                <responsibility>Science</responsibility>
                <responsibility>Math</responsibility>
            </responsibilities>
        </Teacher>
    </Teachers>
</school>

I would want to dynamically parse all the objects and put it into a list. I have created classes for school,students,student,teacher,teacehrs,responsibilities, responsibility.

These are shown below:

import lombok.Data;
@Data
@XmlRootElement(name="school")
public class School {

    private List<Students> Students;
    private List<Teachers> Teachers;
}
@Data
public class Students {
    private List<Student> student;
}
@Data
public class Student {  
    private long Id;    
    private String firstName;   
    private String lastName;    
    private String company; 
    private Responsibilities Responsibilities;
}

@XmlAccessorType(XmlAccessType.PROPERTY)

public class Responsibilities { 
    public List<String> responsibility ;    
}
public class Responsibility {
    private String responsibility;
}
@Data
public class Teachers {

    private List<Teacher> teacher;
}

public class Teacher {
    private String firstName;   
    private String lastName;
    private String company; 
    private Responsibilities Responsibilities;
}

Also i have the main parsing file, where i want to generically pass all the objects through the root tag (school).

public class ParsingXML {

    public static void main(String[] args) {
        // TODO Auto-generated method stub      
        
        List<School> Entries = new ArrayList<School>();
        try {
            File xmlFile = new File("Student.xml");
            JAXBContext jaxbContext;
            jaxbContext = JAXBContext.newInstance(School.class);                         
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();        
            School entries = (School) jaxbUnmarshaller.unmarshal(xmlFile);  
            Entries.add(entries);
            
            /*
             * for(Student s: students.getStudent()) { System.out.println(s); }
             */
               
        }
        catch (JAXBException e) 
        {
            e.printStackTrace();
        }               
        ListIterator<School> litr = Entries.listIterator();   
        System.out.println(Entries.size());
        //System.out.println("\n Using list iterator");
        while(litr.hasNext()){
            System.out.println(litr.next());
        }
    }

}

I expect to get Teachers entries too.. But I get ony students here. Output:

School(Students=[Students(student=[Student(Id=1, firstName=A, lastName=C, company=BCD, Responsibilities=Responsibilities(responsibility=[Leader, Dancer, Reporter])), Student(Id=2, firstName=B, lastName=C, company=EFG, Responsibilities=Responsibilities(responsibility=[Singer]))])], Teachers=null)

Please suggest me my mistakes and provide me some guidance here

1 Answers1

1

The following code would work for you:

School.class

@XmlRootElement(name = "school")
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class School {

    @XmlElementWrapper(name="students")
    @XmlElement(name="student")
    private List<Student> students;

    @XmlElementWrapper(name="Teachers")
    @XmlElement(name="Teacher")
    private List<Teacher> responsibilities;
}

Teacher.class:

@Data
@XmlAccessorType(XmlAccessType.NONE)
public class Teacher {

    @XmlElement(name="firstName")
    private String firstName;

    @XmlElement(name="lastName")
    private String lastName;

    @XmlElementWrapper(name="responsibilities")
    @XmlElement(name="responsibility")
    private List<String> responsibilities;
}

Student.class:


@Data
@XmlAccessorType(XmlAccessType.NONE)
public class Student {
    @XmlElement(name="id")
    private long Id;

    @XmlElement(name="firstName")
    private String firstName;

    @XmlElement(name="lastName")
    private String lastName;

    @XmlElement(name="company")
    private String company;

    @XmlElementWrapper(name="responsibilities")
    @XmlElement(name="responsibility")
    private List<String> responsibilities;
}

Main.class:

public class Main {
    public static void main(String[] args) throws JAXBException, XMLStreamException {
        final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("students.xml");
        final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
        final Unmarshaller unmarshaller = JAXBContext.newInstance(School.class).createUnmarshaller();
        final School school = unmarshaller.unmarshal(xmlStreamReader, School.class).getValue();
        System.out.println(school.toString());

        Marshaller marshaller = JAXBContext.newInstance(School.class).createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(school, System.out);
    }
}

Following is the output:

School(students=[Student(Id=1, firstName=A, lastName=C, company=BCD, responsibilities=[Leader, Dancer, Reporter]), Student(Id=2, firstName=B, lastName=C, company=EFG, responsibilities=[Singer])], responsibilities=[Teacher(firstName=A, lastName=C, responsibilities=[English, Hindi, Softskills]), Teacher(firstName=A, lastName=C, responsibilities=[Science, Math])])
<school>
   <students>
      <student>
         <id>1</id>
         <firstName>A</firstName>
         <lastName>C</lastName>
         <company>BCD</company>
         <responsibilities>
            <responsibility>Leader</responsibility>
            <responsibility>Dancer</responsibility>
            <responsibility>Reporter</responsibility>
         </responsibilities>
      </student>
      <student>
         <id>2</id>
         <firstName>B</firstName>
         <lastName>C</lastName>
         <company>EFG</company>
         <responsibilities>
            <responsibility>Singer</responsibility>
         </responsibilities>
      </student>
   </students>
   <Teachers>
      <Teacher>
         <firstName>A</firstName>
         <lastName>C</lastName>
         <responsibilities>
            <responsibility>English</responsibility>
            <responsibility>Hindi</responsibility>
            <responsibility>Softskills</responsibility>
         </responsibilities>
      </Teacher>
      <Teacher>
         <firstName>A</firstName>
         <lastName>C</lastName>
         <responsibilities>
            <responsibility>Science</responsibility>
            <responsibility>Math</responsibility>
         </responsibilities>
      </Teacher>
   </Teachers>
</school>
BATMAN_2008
  • 2,788
  • 3
  • 31
  • 98