使用XMLAdapter将XML对象列表解组到HashMap中

时间:2014-11-12 16:13:45

标签: java xml jaxb

我有以下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" );

0 个答案:

没有答案
相关问题