简体   繁体   中英

JAVA/JAXB Help needed

This is gonna be lengthy but I need some enlightenment. I'm new to JAXB so please be lenient with me.

CourseApp:

package Courses;

import java.io.File;
import java.util.ArrayList;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class CoursesApp {
    public static void main(String[] args) {
            Courselist courselist = new Courselist();
            courselist.setclassType("Lecture");
            courselist.setcourseCode("2002");
            courselist.setgroupIndex("1");
            courselist.setprofessor("Professor James");
        try{
            File file = new File("C:\\Courselist.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(Courselist.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            jaxbMarshaller.marshal(courselist, file);
            jaxbMarshaller.marshal(courselist, System.out);

        }catch(JAXBException e)
        {
            e.printStackTrace();
        }
    }
}

Courselist:

package Courses;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Courselist {

    String courseCode;
    String classType;
    String groupIndex;
    String professor;

    public String getcourseCode() {
        return courseCode;
    }

    @XmlElement
    public void setcourseCode(String courseCode) {
        this.courseCode = courseCode;
    }

    public String getclassType() {
        return classType;
    }

    @XmlElement
    public void setclassType(String classType) {
        this.classType = classType;
    }

    public String getgroupIndex() {
        return groupIndex;
    }

    @XmlElement
    public void setgroupIndex(String groupIndex) {
        this.groupIndex = groupIndex;
    }

    public String getprofessor() {
        return professor;
    }

    @XmlElement
    public void setprofessor(String professor) {
        this.professor = professor;
    }
}

Output:

  <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <courselist>
  <classType>Lecture</classType> 
  <courseCode>2002</courseCode> 
  <groupIndex>1</groupIndex> 
  <professor>Professor James</professor> 
  </courselist>

What I want is to create another instance of courselist within the same XML:

  <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <courselist>
  -<course>
     <classType>Lecture</classType> 
     <courseCode>2002</courseCode> 
     <groupIndex>1</groupIndex> 
     <professor>Professor James</professor>
   </course>
  -<course>
     <classType>Lecture</classType> 
     <courseCode>2003</courseCode> 
     <groupIndex>2</groupIndex> 
     <professor>Professor John</professor> 
   </course>
  </courselist>

I would recommend to have one member in CourseList: List<Course> when Course will include all the members currently in CourseList .
This is the code:

@XmlRootElement
public class Courselist {
    @XmlElement List<Course> course = new ArrayList<Course>();
}

Courselist

As oshai answered I would have a model with two classes Courselist and Course . Below is what the Courselist class would look like. To match Java programming conventions the package name is normally lower case. Also it is also often based on a domain name (such as com.example.courses ). By default JAXB (JSR-222) implementations look for metadata on the property ( get or set methods) so I've put them there (see: http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html ).

package courses;

import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Courselist {

    List<Course> courses;

    @XmlElement(name="course")
    public List<Course> getCourses() {
        return courses;
    }

    public void setCourses(List<Course> courses) {
        this.courses = courses;
    }

}

Course

The information you had in the Courselist class I have moved to a new Course class. JAXB is configuration by exception so you only need to add annotations where you wish the XML representation to differ from the default. In your use case you don't need any annotations on this class (see: http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html ). I have fixed the casing on your property methods to match the normal Java coding conventions.

package courses;

public class Course {

    String courseCode;
    String classType;
    String groupIndex;
    String professor;

    public String getCourseCode() {
        return courseCode;
    }

    public void setCourseCode(String courseCode) {
        this.courseCode = courseCode;
    }

    public String getClassType() {
        return classType;
    }

    public void setClassType(String classType) {
        this.classType = classType;
    }

    public String getGroupIndex() {
        return groupIndex;
    }

    public void setGroupIndex(String groupIndex) {
        this.groupIndex = groupIndex;
    }

    public String getProfessor() {
        return professor;
    }

    public void setProfessor(String professor) {
        this.professor = professor;
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM