Sie haben zwei Probleme: Bindung der <Variable>
Element an Ihre Karte und Bindung der <Parameter>
Elemente an verschiedene typisierte Objekte.
Ich werde die Probleme in dieser Reihenfolge behandeln. Für die Karte müssen Sie XmlAdapter
mit @XmlJavaTypeAdapter
verwenden.
-Code eine Klasse Ihr <Variable>
Element darstellt und wo es sich:
public class Variable{
@XmlAttribute
public String Name;
@XmlElement
public String Value;
//Getters and setters
}
dann die XMLAdapter Code:
public class YourAdapter extends XmlAdapter<List<Variable>,Map<String,String>>{
public Map<String,String> unmarshall(List<Variable> arg0){
//Logic to convert a List<Variable> into a Map<String,String> and return it
}
public List<Variable> marshall(Map<String,String> arg0){
//Logic to convert a Map<String,String> into a List<Variable> and return it
}
}
Dann Karte Ihre Vertragsklasse:
@XmlRootElement
@XmlSeeAlso({Variable.class})
public class Contract{
@XmlElement(name="Variable")
@XmlJavaTypeAdapter(YourAdapter.class)
private Map<String,String> map;
//Getters and setters
}
Damit Deine Karte sollte funktionieren.
Sie haben zwei Lösungen mit Ihrem zweiten Problem: Entweder Verwenden der JAXB-Referenzimplementierung oder Verwenden der JAXB MOXy-Implementierung.
Mit JAXB Referenzimplementierung
JAXB Referenzimplementierung kann nicht Xpath verwenden seine Bindung zu tun. Also hier ist ein Workaround.
-Code eine zweite Klasse und Adapter für Ihr <Parameter>
Element, das im Wesentlichen mit Ausnahme des Namen die gleiche Sache sein wird, und diese Zuordnung für den Objektbereich:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Variable.class,Parameter.class})
public class Contract{
@XmlElement(name="Variable")
@XmlJavaTypeAdapter(YourAdapter.class)
private Map<String,String> map;
@XmlElement(name="Parameter")
@XmlJavaTypeAdapter(YourAdapterForParameter.class)
private Map<String,String> parameterMap;
public Long getId(){
return Long.valueOf(parameterMap.get("id"));
}
public void setId(Long id){
parameterMap.put("id",id.toString());
}
//Same thing for other getters/setters
}
Mit moxy Implementierung
Mit moxy Implementierung können Sie @XmlPath
und XPath verwenden es ein bisschen sauberer zu machen:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Variable.class})
public class Contract{
@XmlPath("./Variable[@Name='id']/Value")
private Long id;
@XmlPath("./Variable[@Name='templateName']/Value")
private String templateName;
@XmlPath("./Variable[@Name='isComplete']/Value")
private boolean isComplete;
@XmlElement(name="Variable")
@XmlJavaTypeAdapter(YourAdapter.class)
private Map<String,String> map;
//Getters and setters
}
Weitere Informationen/Hilfe finden Sie in der JAXB/MOXy Dokumentation.
[Dies] (http://www.mkyong.com/java/jaxb-hello-world-example/) scheint relevant zu sein. – user5226582
@Sviatlana Wenn Sie * IntelliJ IDEA * verwenden, können Sie [Generieren von Java-Code aus XML-Schema] (https://www.jetbrains.com/help/idea/2016.1/generating-java-code-from-xml- schema.html) posten. –
Es wird nicht in der Community unterstützt. – Sviatlana