Элемент <Country_Reference>
XML содержит коды ISO в довольно
сложный способ в пределах нескольких <wd:ID>
элементов XML.
Поэтому слишком просто моделировать их как свойство Java String
.
Вместо этого вам нужно смоделировать Java-структуру с большим сходством с XML-структурой.
Последовательность элементов XML <wd:ID>
может быть смоделирована свойством List<ID> idList
который должен быть аннотирован @XmlElement(name="ID")
.
Атрибут XML wd:Descriptor="...."
можно смоделировать с помощью свойства String descriptor
который должен быть аннотирован @XmlAttribute(name="Descriptor")
.
Для вашего удобства вы можете добавить конструктор all-arguments и несколько методов для получения
коды WID и ISO от List<ID>
.
@XmlAccessorType(XmlAccessType.FIELD)
public class Country {
@XmlAttribute(name = "Descriptor")
private String descriptor;
@XmlElement(name = "ID")
private List<ID> idList;
public Country() {
}
public Country(String descriptor, String wid, String isoAlpha2Code, String isoAlpha3Code, String isoNumeric3Code) {
this.descriptor = descriptor;
idList = new ArrayList<>();
idList.add(new ID("WID", wid));
idList.add(new ID("ISO_3166-1_Alpha-2_Code", isoAlpha2Code));
idList.add(new ID("ISO_3166-1_Alpha-3_Code", isoAlpha3Code));
idList.add(new ID("ISO_3166-1_Numeric-3_Code", isoNumeric3Code));
}
public String getWid() {
return getIdByType("WID");
}
public String getIsoAlpha2Code() {
return getIdByType("ISO_3166-1_Alpha-2_Code");
}
public String getIsoAlpha3Code() {
return getIdByType("ISO_3166-1_Alpha-3_Code");
}
public String getIsoNumeric3Code() {
return getIdByType("ISO_3166-1_Numeric-3_Code");
}
private String getIdByType(String idType) {
for (ID id : idList) {
if (id.getType().equals(idType))
return id.getValue();
}
return null;
}
}
Элементы XML <wd:ID>
довольно сложны. Поэтому нам нужен отдельный класс POJO для их моделирования.
Давайте назовем класс ID
.
Текст XML между <wd:ID ..>
и </wd:ID>
моделируется свойством String value
который должен быть аннотирован @XmlValue
.
Атрибут XML wd:type="..."
моделируется свойством String type
который должен быть аннотирован @XmlAttribute
.
Для удобного использования вышеприведенным классом Country
добавлен конструктор со всеми аргументами.
@XmlAccessorType(XmlAccessType.FIELD)
public class ID {
@XmlAttribute
private String type;
@XmlValue
private String value;
public ID() {
}
public ID(String type, String value) {
this.type = type;
this.value = value;
}
// public getters and setters (omitted here fro brevity)
}
Скриншот ниже (взятый из отладчика) визуализирует структуру Java
и подтверждает, что демаршаллинг вашего примера XML работает правильно:
