У вас есть две проблемы: Связывание <Variable>
Элемент вашей карты и привязка элементов <Parameter>
к различным типизированным объектам.
Я рассмотрю проблемы в этом порядке.
Для получения карты вы должны будете использовать XmlAdapter
с @XmlJavaTypeAdapter
.
Код класса, представляющий свой <Variable>
элемент и отобразить его:
public class Variable{
@XmlAttribute
public String Name;
@XmlElement
public String Value;
//Getters and setters
}
Тогда закодировать XMLAdapter:
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
}
}
Затем сопоставить класс Contract:
@XmlRootElement
@XmlSeeAlso({Variable.class})
public class Contract{
@XmlElement(name="Variable")
@XmlJavaTypeAdapter(YourAdapter.class)
private Map<String,String> map;
//Getters and setters
}
С этим, ваша карта должна работать.
У вас есть два решения со второй проблемой: либо с использованием реализации JAXB Reference, либо с использованием реализации JAXB MOXy.
С эталонным JAXB реализации
JAXB Reference реализация не может использовать Xpath, чтобы сделать его обязательным. Итак, вот обходной путь.
код второй класс и адаптер для <Parameter>
элемента, который в основном собирается быть тем же самым для имен, за исключением, и использовать это отображение для контракта:
@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
}
С реализацией Moxy
с внедрением Moxy, вы можете использовать @XmlPath
и XPath, чтобы сделать его немного чище:
@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
}
За дополнительной информацией/справкой обратитесь к документации JAXB/MOXy.
[Это] (http://www.mkyong.com/java/jaxb-hello-world-example/) представляется актуальным. – user5226582
@Sviatlana Если вы используете * IntelliJ IDEA *, вы можете посмотреть [Генерирование кода Java из схемы XML] (https://www.jetbrains.com/help/idea/2016.1/generating-java-code-from-xml- schema.html) сообщение. –
Это не поддерживается в Сообществе .. – Sviatlana