2012-11-10 3 views
2

Ça va être long mais j'ai besoin d'éclaircissement. Je suis nouveau à JAXB alors s'il vous plaît soyez indulgent avec moi.JAVA/JAXB Aide nécessaire

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; 
    } 
} 

Sortie:

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

Ce que je veux est de créer une autre instance de courselist dans le même 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> 
+0

La sortie souhaitée n'est pas un document XML valide. – toniedzwiedz

+0

Désolé, je me rends compte que ce n'est pas trop. Édité. –

+0

est-il possible de changer la structure xml pour avoir un élément 'course'? – oshai

Répondre

2

Je recommanderais d'avoir un membre à CourseList: List<Course> lorsque Course comprendra tous les membres actuellement dans CourseList.
Voici le code:

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

Courselist

Comme je oshai answered un modèle avec deux classes Courselist et Course. Voici à quoi ressemblerait la classe Courselist. Pour faire correspondre les conventions de programmation Java, le nom du paquet est normalement en minuscule. En outre, il est également souvent basé sur un nom de domaine (tel que com.example.courses). Par défaut, les implémentations JAXB (JSR-222) recherchent des métadonnées sur la propriété (méthodes get ou set), donc je les ai mises là (voir: 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; 
    } 

} 

Cours

Les informations que vous aviez dans la classe que j'ai Courselist déménagé dans une nouvelle classe Course. JAXB est une configuration par exception, vous n'avez donc besoin d'ajouter des annotations que si vous souhaitez que la représentation XML diffère de la valeur par défaut. Dans votre cas d'utilisation, vous n'avez pas besoin d'annotations sur cette classe (voir: http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html). J'ai corrigé le casing sur vos méthodes de propriété pour correspondre aux conventions de codage Java normales.

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; 
    } 

}