2012-12-04 23 views
5

Ben JAXB kullanarak bir xml dosyası unmarshal çalışıyorum. @XmlElement öğesini doğru adla ve ad alanıyla birlikte unmarshalling (ör. @XmlElement (name = "name", namespace = "http://www.test.com")) kullanırkenJAXB ile unmarshalling xml - XmlType ve proporder ile ad alanı

XmlType birlikte kullanırsam propOrder ile maalesef artık değil (örneğin @XmlType (namespace = "http://www.test.com", name = "", propOrder = {"name", "description"})).

xml dosyası (test.xml) içeriği: JAXBExample.java içeriğidir

<Operation xmlns="http://www.test.com"> 
    <Parameter> 
    <name>Param1</name> 
    <description>Description of Parameter1</description> 
    </Parameter> 
    <Parameter> 
    <name>Param2</name> 
    <description>Description of Parameter2</description> 
    </Parameter> 
</Operation> 

:

package stackoverflow.problem.jaxb.ns; 

import java.io.FileNotFoundException; 
import java.io.FileReader; 

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

public class JAXBExample { 

    public static void main(String[] args) throws JAXBException, FileNotFoundException { 
    String xmlFilename = "test.xml"; 

    JAXBContext context = JAXBContext.newInstance(Operation.class); 

    System.out.println("Output from our XML File: "); 
    Unmarshaller um = context.createUnmarshaller(); 
    Operation op = (Operation) um.unmarshal(new FileReader(xmlFilename)); 

    System.out.println("Operation-Content: " + op); 
    } 

} 

paket stackoverflow.problem içeriği. jaxb.ns;

import java.util.List; 

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


@XmlRootElement(name="Operation", namespace="http://www.test.com") 
@XmlAccessorType(XmlAccessType.FIELD) 

public class Operation { 

    @XmlElement(name = "Parameter", namespace="http://www.test.com") 
    List<Parameter> parameterList; 

    @Override 
    public String toString(){ 
    String retVal = ""; 
    for(Parameter currentParameter: parameterList){ 
     retVal += currentParameter.toString() + "\n"; 
    } 
    return retVal; 
    } 
} 

Ve Parameter.java içeriği geçerli:

package stackoverflow.problem.jaxb.ns; 

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; 

@XmlType(namespace="http://www.test.com", name = "", propOrder = {"name", "description"}) 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Parameter { 

    //@XmlElement(name = "name", namespace="http://www.test.com") 
    String name; 

    //@XmlElement(name = "description", namespace="http://www.test.com") 
    String description; 

    @Override 
    public String toString(){ 
    return this.name + "\t" + this.description; 
    } 
} 

Geçen kod bloğu (Parameter.java) iki @XmlElement hatları, unmarshalling çalışıyor yorumsuz. Bu iki satır eklenmezse, Parametre nesnesindeki her iki alan boştur. XmlType içinde propOrder kullanırken bir ad alanı bildirmenin başka bir yolu var mı? Yoksa başka bir şey mi yanlış yaptım?

cevap

5

ad da package-info.java adlı bir dosyada, her sınıf veya sahada bunu tekrarlamak zorunda değilsiniz bu şekilde, paket başına tanımlanabilir:

@javax.xml.bind.annotation.XmlSchema (
    namespace = "http://www.test.com", 
    elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED 
) 
package stackoverflow.problem.jaxb.ns; 
+2

+1 - Daha fazla bilgi için JAXB hakkında ve ad alanlarına bakın: http://blog.bdoughan.com/2010/08/jaxb-namespaces.html –

+1

Sadece bunu belirtmek için: her alana koymak zorunda kalmadan sadece kodu daha az karmaşık hale getirmekle kalmaz propOrder'da isim alanını kullanma problemini çözer. – Exocom

İlgili konular