2010-08-06 40 views
3

J'ai ce fichier xml dont je veux le retirer dans un objet Java. J'utilise la bibliothèque MOXy JAXB.Je voudrais sérialiser un fichier xml en objets Java

test.xml

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

<project > 
    <type>org.netbeans.modules.ant.freeform</type> 
      <compilation-unit> 
       <package-root>src</package-root> 
       <classpath mode="boot">${sunspot.bootclasspath}</classpath> 
       <classpath mode="compile">${sunspot.classpath}</classpath> 
       <built-to>build</built-to> 
       <source-level>1.4</source-level> 
      </compilation-unit> 

</project> 

Voici mes classes java: Project.java

package example; 

import java.util.List; 

import javax.xml.bind.annotation.*; 


import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement 
@XmlType(name = "project",propOrder = {"type", "compilation_unit"}) 
public class Project { 
    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    private String type; 


    @XmlPath("/compilation-unit") 
    @XmlElement(name = "compilation-unit") 
    private CompilationUnit compilation_unit; 

    public CompilationUnit getPckg() { 
     return compilation_unit; 
    } 

    public void setPckg(String pckg) { 
     this.compilation_unit = compilation_unit; 
    } 


} 

CompilationUnit

package example; 

import org.eclipse.persistence.oxm.annotations.XmlPath; 

import javax.xml.bind.annotation.XmlType; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import java.util.List; 

/** 
* Created by IntelliJ IDEA. 
* User: ronny 
* Date: Aug 5, 2010 
* Time: 11:28:37 AM 
* To change this template use File | Settings | File Templates. 
*/ 
@XmlType(name = "compilation-unit", propOrder = {"package_root","built_to" ,"source_level" ,"classpath"}) 

public class CompilationUnit { 
    public String getPackage_root() { 
     return package_root; 
    } 

    public void setPackage_root(String package_root) { 
     this.package_root = package_root; 
    } 

    public String getBuilt_to() { 
     return built_to; 
    } 

    public void setBuilt_to(String built_to) { 
     this.built_to = built_to; 
    } 

    public String getSource_level() { 
     return source_level; 
    } 

    public void setSource_level(String source_level) { 
     this.source_level = source_level; 
    } 

    public List<Classpath> getClasspath() { 
     return classpath; 
    } 

    public void setClasspath(List<Classpath> classpath) { 
     this.classpath = classpath; 
    } 

    private String package_root; 
    private String built_to; 
    private String source_level; 
    private List<Classpath> classpath; 

} 

Classpath:

package example; 

import javax.xml.bind.annotation.XmlAttribute; 

/** 
* Created by IntelliJ IDEA. 
* User: leontiad 
* Date: Aug 5, 2010 
* Time: 11:33:52 AM 
* To change this template use File | Settings | File Templates. 
*/ 
public class Classpath { 
    @XmlAttribute 
    private String mode; 
} 

et la classe de démonstration pour les tests:

package example; 

import java.io.FileInputStream; 

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

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Project.class); 

     FileInputStream xml = new FileInputStream("C:\\task.xml"); 
     Project project = (Project) jc.createUnmarshaller().unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(project, System.out); 
    } 
} 

et ce que je reçois en tant que sortie est la suivante:

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <type>org.netbeans.modules.ant.freeform</type> 
</project> 

pourrait quelqu'un aide à comprendre pourquoi le w trou fichier xml n'est pas imprimé et seulement une partie de celui-ci?

Répondre

1

Je n'ai pas beaucoup utilisé JAXB, mais je pense que le champ compilation_unit n'a pas besoin de @XmlPath ("/ compilation-unit"). Je pense que lorsque le xml est désérialisé, l'annotation du chemin ne correspond pas au xml.

+0

Oui le problème était le @XmlPath annotation.Also je dois ajouter l'annotation @XmlElement à chaque var au CompilationUnit.java Mais il y a un problème avec le : il imprime uniquement l'attribut .Je suis en train de voir ce qu'il devrait être inclus dans le fichier Classpath.java afin de maintenir la valeur de l'élément ..? – curious

+0

Pour plus d'informations sur l'annotation @XmlPath, voir: http://bdoughan.blogspot.com/2010/07/xpath-based-mapping.html –

1

Vous venez de manquer quelques annotations, ci-dessous sont les classes corrigées:

CompilationUnit

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import java.util.List; 

/** 
* Created by IntelliJ IDEA. 
* User: leontiad 
* Date: Aug 5, 2010 
* Time: 11:28:37 AM 
* To change this template use File | Settings | File Templates. 
*/ 
@XmlType(name = "compilation-unit", propOrder = {"package_root","built_to" ,"source_level" ,"classpath"}) 
@XmlAccessorType(XmlAccessType.FIELD) 
public class CompilationUnit { 
    public String getPackage_root() { 
     return package_root; 
    } 

    public void setPackage_root(String package_root) { 
     this.package_root = package_root; 
    } 

    public String getBuilt_to() { 
     return built_to; 
    } 

    public void setBuilt_to(String built_to) { 
     this.built_to = built_to; 
    } 

    public String getSource_level() { 
     return source_level; 
    } 

    public void setSource_level(String source_level) { 
     this.source_level = source_level; 
    } 

    public List<Classpath> getClasspath() { 
     return classpath; 
    } 

    public void setClasspath(List<Classpath> classpath) { 
     this.classpath = classpath; 
    } 

    @XmlElement(name="package-root") 
    private String package_root; 

    @XmlElement(name="built-to") 
    private String built_to; 

    @XmlElement(name="source-level") 
    private String source_level; 
    private List<Classpath> classpath; 

} 

Projet

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlRootElement 
@XmlType(name = "project",propOrder = {"type", "compilation_unit"}) 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Project { 
    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    private String type; 

    @XmlElement(name = "compilation-unit") 
    private CompilationUnit compilation_unit; 

    public CompilationUnit getPckg() { 
     return compilation_unit; 
    } 

    public void setPckg(String pckg) { 
     this.compilation_unit = compilation_unit; 
    } 

} 

Pour votre information, ci-dessous est un article sur le @ XmlPath: