Unmarshalling xml avec JAXB - espace de noms avec XmlType et proporder
Je suis en train de unmarshal un fichier xml à l'aide de JAXB. Quand je suis à l'aide de @XmlElement avec le bon nom et l'espace de la unmarshalling (par exemple, @XmlElement(name = "nom" namespace="http://www.test.com"))
Si j'utilise XmlType avec propOrder il n'est malheureusement pas plus (par exemple, @XmlType(namespace="http://www.test.com", nom = "", propOrder = {"nom", "description"})).
Le contenu du fichier xml (test.xml):
<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>
Le contenu de JAXBExample.java est:
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);
}
}
Le contenu de
paquet de stackoverflow.problème.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;
}
}
Et le Contenu de Parameter.java est:
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;
}
}
Si je décommentez les deux @XmlElement lignes dans le dernier bloc de code (Parameter.java), la unmarshalling fonctionne très bien. Si ces deux lignes ne sont pas inclus, les deux champs dans le Paramètre de l'objet sont nulles. Est-il une autre façon de déclarer un espace de noms lors de l'utilisation de propOrder dans XmlType? Ou ai-je fais quelque chose de mal?
OriginalL'auteur Exocom | 2012-12-04
Vous devez vous connecter pour publier un commentaire.
L'espace de noms peut également être défini par paquet, dans un fichier nommé
package-info.java
, de cette façon, vous n'avez pas à répéter sur chaque classe ou domaine:Juste à point: il n'est pas seulement de rendre le code moins encombré de ne pas avoir à le mettre dans tous les domaines, il résout également le problème de l'utilisation de l'espace de noms dans propOrder.
OriginalL'auteur Jörn Horstmann