JaxB: Как я могу получить текстовый атрибут из вложенного элемента? - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу, чтобы в классе Country сохранялся код "ISO_3166-1_Alpha-2_Code". Код в настоящее время возвращает код «ISO_3166-1_Numeric-3_Code». Не могу понять, как настроить класс Country, чтобы получить нужный мне атрибут.

XML:

<?xml version='1.0' encoding='UTF-8'?>
<wd:Message_Event_Configuration">
    <wd:Message_Event_Configuration_Data>
        <wd:Country_Reference wd:Descriptor="Saint Martin">
            <wd:ID wd:type="WID">66b7082a21e510000961bb6d82b5002a</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Alpha-2_Code">MF</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Alpha-3_Code">MAF</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Numeric-3_Code">663</wd:ID>
        </wd:Country_Reference>
        <wd:Country_Reference wd:Descriptor="Saint Barthelemy">
            <wd:ID wd:type="WID">881527f6cec910000ba81e8dccf61127</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Alpha-2_Code">BL</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Alpha-3_Code">BLM</wd:ID>
            <wd:ID wd:type="ISO_3166-1_Numeric-3_Code">652</wd:ID>
        </wd:Country_Reference>
    </wd:Message_Event_Configuration_Data>
</wd:Message_Event_Configuration>

Список стран:

@XmlRootElement(name = "Message_Event_Configuration")
@XmlAccessorType(XmlAccessType.FIELD)
public class Countries {

    @XmlElementWrapper(name = "Message_Event_Configuration_Data")
    @XmlElement(name = "Country_Reference")

    private List<Country> countries = new ArrayList<Country>();

    public List<Country> getCountries() {
        return countries;
    }

    public void setCountries(List<Country> countries) {
        this.countries = countries;
    }

}

Страна:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Country_Reference")
public class Country {

    @XmlElement(name = "ID")
    private String isoCode;

    public Country() {
    }

    public Country(String isoCode) {
        this.isoCode = isoCode;
    }

    @XmlAttribute(name = "ISO_3166-1_Alpha-2_Code")
    public String getISOCode() {
        return isoCode;
    }

    public void setISOCode(String isoCode) {
        this.isoCode = isoCode;
    }
}

1 Ответ

0 голосов
/ 10 ноября 2018

Элемент <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 работает правильно:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...