3

JAXBを使用してオブジェクトのマーシャリングを解除するXMLソースがあります。XMLソース:

<album>
    <name>something</name>
    <id>003030</id>
    <artist>someone</artist>
    ...
</album>

Javaソースは次のようなものです(必要なゲッター/セッターもあります):

@XmlRootElement(name="album")
class Album {
    String name;
    Long id;
    String artist;
    ...
}

ここまでは順調ですね。これで、アルバムリスト内にさまざまなサイズの画像URLが表示されます。

...
<image size="small">http://.../small.jpg</image>
<image size="medium">http://.../medium.jpg</image>
<image size="large">http://.../large.jpg</image>
...

私はそれを次のようなJavaマップにマップしたいと思います。

Map<String,String> imageUrls;

ここで、マップのキーはサイズ属性であり、マップの値は要素値です。可能であれば、この変数にどのように注釈を付ける必要がありますか?

4

1 に答える 1

5

ヘルパー クラス Pair

@XmlAccessorType(XmlAccessType.FIELD)
public class Pair {

    @XmlAttribute
    private String key;

    @XmlValue
    private String value;

    public Pair() {
    }

    public Pair(String key, String value) {
        this.key = key;
        this.value = value;
    }  
//... getters, setters  
}  

ペア一覧

@XmlAccessorType(XmlAccessType.FIELD)
public class PairList 
{
    private List<Pair> values = new ArrayList<Pair>();

    public PairList() {
    }  
//...  
}  

アダプタ

public class MapAdaptor extends XmlAdapter<PairList, Map<String, String>> 
{
    @Override
    public Map<String, String> unmarshal(PairList list) throws Exception 
    {
        Map<String, String> retVal = new HashMap<String, String>();
        for (Pair keyValue : list.getValues()) 
        {
            retVal.put(keyValue.getKey(), keyValue.getValue());
        }
        return retVal;
    }

    @Override
    public PairList marshal(Map<String, String> map) throws Exception 
    {
        PairList retVal = new PairList();
        for (String key : map.keySet()) 
        {
            retVal.getValues().add(new Pair(key, map.get(key)));
        }
        return retVal;
    }
}

エンティティでの使用

@XmlJavaTypeAdapter(value = MapAdaptor.class)
private Map<String, String> imageUrls = new HashMap<String, String>();  

PS アダプター の代わりにクラスを使用
せずに実行できますPairListPair[]PairList

public class MapAdaptor extends XmlAdapter<Pair[], Map<String, String>> 
{
    @Override
    public Map<String, String> unmarshal(Pair[] list) throws Exception 
    {
        Map<String, String> retVal = new HashMap<String, String>();
        for (Pair keyValue : Arrays.asList(list)) 
        {
            retVal.put(keyValue.getKey(), keyValue.getValue());
        }
        return retVal;
    }

    @Override
    public Pair[] marshal(Map<String, String> map) throws Exception 
    {
        List<Pair> retVal = new ArrayList<Pair>();
        for (String key : map.keySet()) 
        {
            retVal.add(new Pair(key, map.get(key)));
        }
        return retVal.toArray(new Pair[]{});
    }
}  

ただし、この場合、すべてのペアの名前を制御することはできません。アイテムとなり、変更することはできません

<item key="key2">valu2</item>
<item key="key1">valu1</item>  

PS2の代わりに
使用しようとすると、List<Pair>PairListException

ERROR: java.util.List haven't no-arg constructor
于 2012-09-05T20:36:40.303 に答える