解组 java 对象中的 XML 键值对

Unmarshalling of XML key-value pair in java object

使用 jaxb 将 XML 键值部分解组到 java 对象中。我试过使用地图适配器,但我做不到。

<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>  

您可以使用适配器来执行此操作,但据我了解您的要求,这不是必需的。如果您只是想解组为一个对象,而不是一个 Map,您可以执行以下操作:

从根开始:

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

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

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

}

让我们把类型移开:

@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;
}

Info 将您的键作为属性,然后是一些值。它看起来像这样:

@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 有效负载。

干杯