我正在使用 JAXB,所以我问的很多问题只是为了看看有什么可能。
我有以下 XML:
<bundleMappings>
<mapping>
<parameter attr = "value">asdas</parameter>
<parameter attr = "value2">d123asdsad</parameter>
<parameter attr = "value3">0</parameter>
</mapping>
<mapping>
<parameter attr = "value">23123s</parameter>
<parameter attr = "value2">qwerty</parameter>
<!-- more parameter elements -->
</mapping>
<!-- more mapping elements -->
</bundleMappings>
其中我想要 parameter
Map<String, Parameter>
中的元素而不是列表,其中键是 attr
value,value 就是元素的内容。我关注了一些博客文章并提出了这个。
@XmlRootElement(name = "bundleMmappings")
public class BundleMappings {
@XmlElement(name = "mapping")
private List<Mapping> mMappings;
//getters setters
}
@XmlAccessorType(XmlAccessType.FIELD)
public class Mapping {
@XmlElement
@XmlJavaTypeAdapter(ParameterAdapter.class)
private HashMap<String, Parameter> mParameterMap;
//getters setters
}
@XmlAccessorType(XmlAccessType.FIELD)
public class Parameter {
@XmlAttribute(name = "attr")
private String mName;
@XmlValue
private String mValue;
//getters setters
}
@XmlAccessorType(XmlAccessType.FIELD)
public class Parameters {
@XmlElement(name = "parameters")
private List<Parameter> parameters = new LinkedList<>();
//getters setters
}
和适配器:
public class ParameterAdapter extends XmlAdapter<Parameters, Map<String, Parameter>> {
@Override
public Parameters marshal(Map<String, Parameter> map) throws Exception {
Parameters params = new Parameters();
params.setParameters(new ArrayList<Parameter>());
for (String name : map.keySet()) {
Parameter p = new Parameter();
p.setName(name);
p.setValue(map.get(name).getValue());
params.getParameters().add(p);
}
return params;
}
@Override
public Map<String, Parameter> unmarshal(Parameters value) throws Exception {
Map<String, Parameter> map = new HashMap<>();
for (Parameter parameter : value.getParameters()) {
map.put(parameter.getName(), parameter);
}
return map;
}
}
我在适配器 unmarshal
中使用断点做了一个小型的解码测试。它根本没有被调用。为什么不呢?
我还尝试注释 Mapping
类List
与 @XmlElement(name = "parameter")
。在这种情况下 unmarshall
被称为但 Parameters
传递给它的参数有一个空列表。
编辑
如果我尝试编码:
<bundleMappings>
<mapping>
<mParameterMap>
<parameter name="HOME_NETWORK_ID">12345</parameter>
</mParameterMap>
</mapping>
</bundleMappings>
最佳答案
当您在集合属性上指定 XmlAdapter
时,它将应用于集合中的项目。
public class Mapping {
@XmlElement
@XmlJavaTypeAdapter(ParameterAdapter.class)
private List<Parameter> mParameters;
//getters setters
}
这意味着 ParameterAdapter
需要看起来像这样,其中 Foo
是将 Parameter
转换为:
public class ParameterAdapter extends XmlAdapter<Foo, Parameter> {
map 示例
下面是我博客中的示例链接,其中 XmlAdapter
用于 Map
属性:
关于java - 未调用 XmlAdapter 将 List 适配为 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14204167/