2010-06-17 64 views
4

我有一個Java bean ala如何將數組索引添加到JAXB生成的XML中?

@XmlRootElement public class Bean { 
    @XmlElementWrapper(name = "ints") @XmlElement(name = "int") 
    int[] values; 

    // constructors, getters, setters, etc... 
} 

JAXB正在生成XML,如

<bean> 
    <ints> 
     <int>12</int> 
     <int>34</int> 
     <int>56</int> 
    </ints> 
</bean> 

我希望數組索引包含在<int>標籤上,因爲數組位置傳達了重要的值。最好像

<bean> 
    <ints> 
     <int id='0'>12</int> 
     <int id='1'>34</int> 
     <int id='2'>56</int> 
    </ints> 
</bean> 

這樣的屬性有沒有辦法做到這一點?

回答

7

XML元素的順序確實是攜帶信息。一系列元素具有明確的順序,因此添加數組索引將是多餘的,除非您計劃跳過索引或使其失序。

由於這個原因,JAXB沒有提供自動處理問題的方法。如果你仍然想做到這一點,你需要包裝,其中包含索引值作爲@XmlAttribute值一類你的價值觀:

@XmlRootElement 
public class Bean { 
    @XmlElementWrapper(name = "ints") 
    @XmlElement(name = "int") 
    MyInt[] values; 

    // constructors, getters, setters, etc... 
} 

public class MyInt { 
    @XmlAttribute(name="id") 
    int id; 

    @XmlValue 
    int value; 
} 

它將由你來確保id字段填入正確。

+0

謝謝,這是有道理的。 部分原因是該數組是指在另一個字段中指定大小的矩陣的上對角線。 我需要一個指定的行和列。 (我以前沒有意識到) 無論如何,我認爲你的方法也適用於這種情況。 – oconnor0 2010-06-18 16:02:57

4

你也可以做到這一點使用的XmlAdapter

更改您的Bean類,看起來像這樣:

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement 
public class Bean { 

    @XmlElement(name = "ints") 
    @XmlJavaTypeAdapter(IndexAdapter.class) 
    int[] values; 

} 

的@XmlJavaTypeAdapter允許您將財產轉換爲另一種對象,JAXB將元帥。這與上面的建議類似,不需要改變模型。該適配器將如下所示:

import javax.xml.bind.annotation.adapters.XmlAdapter; 
import forum.AdaptedArray.AdaptedArrayValue; 

public class IndexAdapter extends XmlAdapter<AdaptedArray, int[]>{ 

    @Override 
    public AdaptedArray marshal(int[] v) throws Exception { 
     AdaptedArray adaptedArray = new AdaptedArray(); 
     for(int x=0; x<v.length; x++) { 
      adaptedArray.addValue(x, v[x]); 
     } 
     return adaptedArray; 
    } 

    @Override 
    public int[] unmarshal(AdaptedArray v) throws Exception { 
     int[] intArray = new int[v.ints.size()]; 
     for(AdaptedArrayValue adaptedArrayValue : v.ints) { 
      intArray[adaptedArrayValue.index] = adaptedArrayValue.value; 
     } 
     return intArray; 
    } 

} 

的適應值類會是什麼樣子:

import java.util.ArrayList; 
import java.util.List; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlValue; 

public class AdaptedArray { 

    @XmlElement(name="int") 
    List<AdaptedArrayValue> ints = new ArrayList<AdaptedArrayValue>();; 

    public void addValue(int index, int value) { 
     AdaptedArrayValue adaptedArrayValue = new AdaptedArrayValue(); 
     adaptedArrayValue.index = index; 
     adaptedArrayValue.value = value; 
     ints.add(adaptedArrayValue); 
    } 

    public static class AdaptedArrayValue { 
      @XmlAttribute int index; 
      @XmlValue int value; 
    } 

} 
相關問題