解组 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 有效负载。
干杯
使用 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 有效负载。
干杯