我有以下XML
<demographics>
<field>
<value>03290</value>
<XMLtag>study_identifier</XMLtag>
</field>
<field>
<value>somename</value>
<XMLtag>name</XMLtag>
</field>
<filename>bbRad_BUILD_dem_03290_BUILD_006742.xml</filename>
<study_cache_dir>somestring</study_cache_dir>
</demographics>
Demographics2类中的注释目前是这样的:
@XmlRootElement( name = "demographics" )
public class Demographics2
{
@XmlElement( name = "study_cache_dir" )
private String studyCacheDir;
@XmlElement( name = "filename" )
private String filename;
@XmlElement( name = "field" )
private List<Field2> mutivalueFields;
}
Field2.java(简单容器):
public class Field2
{
@XmlElement( name = "XMLtag")
private String xmlTag;
@XmlElement( name = "value" )
private String value;
}
如果我解组XML它工作正常,multivalueFields
包含两个Field2
对象的列表。我想要的是将List< Field2 >
转换为HashMap< String, Field2 >
,其中String键将是xmlTag
对象中的Field2
值。
到目前为止,我已经厌倦了更改Demographics2类并使用XmlAdapter,如下所示:
@XmlElement( name = "field" )
@XmlJavaTypeAdapter( MultiValueFieldsAdapter.class )
private Map< String, Field2> mutivalueFields;
我认为适配器应该像这样工作:
public class MultiValueFieldsAdapter extends XmlAdapter< List<Field2>, Map<String, Field2>> {
@Override
public List<Field2> marshal( Map<String, Field2> arg0) throws Exception {
// loop all in Map and just add the Field2 objects to a list then
// return the list
return null;
}
@Override
public Map<String, Field2> unmarshal( List<Field2> arg0 ) throws Exception {
// The problem is here arg0 will be emtpy list, unless we make arg0 a Field2 object
// it seems to be calling unmarshal for each Field2 object, rather than some list
// loop each Field2 and add to Map
Map<String, Field2> newMap = new HashMap<String, Field2>( arg.length() );
for ( Field2 f : arg0 )
newMap.put( f.xmlTag, f );
}
}
我的MultiValueFieldsAdapter错了,但我也觉得我的注释可能不正确?
我无法弄清楚它是如何设法将所有Field2对象放入只有@XmlElement( name = "field" )
的List中的,它必须是正在进行转换的JAXB,但我找不到如何覆盖它并放入映射。
不幸的是,XML是固定的,我必须使用这种格式的XML。我试图避免的是,一旦XML被解组,我不想循环遍历multivalueField并检查每个Field2的每个xmlTag以进行匹配。如果他们在地图中我可以做:
Field2 nameField = multivalueFields.get( "name" );