views:

87

answers:

2

I have this xml file which i want to unmarchal it in a java object.I am using the MOXy JAXB library.

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>

Here is my java classes: 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: 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"})

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

and the Demo class for testing:

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

and what i am getting as output is the following:

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

Could anyone help to understand why the whole xml file is not printed and only a portion of it?

+1  A: 

I have not used JAXB much, but I think the compilation_unit field does not need the @XmlPath("/compilation-unit"). I think when the xml is deserialized, the path annotation does not match the xml.

Robert Diana
Yes the problem was the @XmlPath annotation.Also i have to add the @XmlElement annotation to each var at the CompilationUnit.java But there is a problem with the <classpath>: <classpath mode="boot"/> <classpath mode="compile"/>It only prints the attribute .I am trying to see what it should be included in the Classpath.java file in order to hold the value of the element..?
herc
For more information on the @XmlPath annotation see: http://bdoughan.blogspot.com/2010/07/xpath-based-mapping.html
Blaise Doughan
A: 

You were just missing a couple of annotations, below are the corrected classes:

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; 

}

Project

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

}

FYI, below is an article on the @XmlPath annotation:

Blaise Doughan