Распаковка пары ключ-значение XML в Java-объекте - PullRequest
0 голосов
/ 14 октября 2019

Unmarshall часть значения ключа XML в объект Java с использованием jaxb. Я пытался использовать адаптер карты, но я не могу это сделать.

<ACCOUNT_CHANGES>
    <TYPE value="Active" />
    <RECORD>
        <SUBSCRIPTION>
            <INFO key="aaa">
                <![CDATA[042]]>
            </INFO>
            <INFO key="bbb">
                <![CDATA[45]]>
            </INFO>
            <INFO key="uuid">
                <![CDATA[d9a7e94c-0a9d-c745-82e9-980877cc5043]]>
            </INFO>
            <INFO key="ccc">
                <![CDATA[Active]]>
            </INFO>
            <INFO key="companyname">
                <![CDATA[ltd]]>
            </INFO>
        </SUBSCRIPTION>
    </RECORD>
</ACCOUNT_CHANGES>  

1 Ответ

1 голос
/ 15 октября 2019

Вы можете использовать адаптер для этого, но, насколько я понимаю, ваше требование не является обязательным. Если вы просто хотите демонтировать объект, а не объект Map, вы можете сделать следующее:

Начиная с корня:

@XmlRootElement(name = "ACCOUNT_CHANGES")
@XmlAccessorType(XmlAccessType.FIELD)
public class AccountChanges {

    @XmlElement(name = "TYPE")
    private Type type;

    @XmlElement(name = "RECORD")
    private Record record;

}

Давайте уберем Type с пути:

@XmlAccessorType(XmlAccessType.FIELD)
public class Type {

    @XmlAttribute
    private String value;
}

Затем запись:

@XmlAccessorType(XmlAccessType.FIELD)
public class Record {

    @XmlElement(name = "SUBSCRIPTION")
    private Subscription subscription;
}

И подписка:

@XmlAccessorType(XmlAccessType.FIELD)
public class Subscription {

    @XmlElement(name = "INFO")
    private List<Info> infoList;
}

Информация имеет ваш ключ в качестве атрибута, а затем некоторое значение. Это выглядело бы так:

@XmlAccessorType(XmlAccessType.FIELD)
public class Info {

    @XmlAttribute
    private String key;

    @XmlValue
    private String value;

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }
}

Это приведет к демонтажу вашего xml, и информационные ключи и значения будут в полях. Если вам нужен ключ и значение на карте, вы можете использовать адаптер.

Адаптер выглядит следующим образом:

public class MyMapAdapter extends XmlAdapter<Info, Map<String, String>> {

    private HashMap<String, String> hashMap = new HashMap<String, String>();

    @Override
    public Map<String, String> unmarshal(Info v) throws Exception {
        hashMap.put(v.getKey(), v.getValue());
        return hashMap;
    }

    @Override
    public Info marshal(Map<String, String> v) throws Exception {
        // do here actions for marshalling if u also marshal
        return null;
    }
}

И вы измените Подписку, чтобы использовать адаптер и иметь карту в качестве поля:

@XmlAccessorType(XmlAccessType.FIELD)
public class Subscription {

    @XmlElement(name = "INFO")
    @XmlJavaTypeAdapter(MyMapAdapter.class)
    private Map<String, String> infoMap;
}

Два способа,оба демонтируют вашу полезную нагрузку xml.

Cheers

...