如何将数组索引添加到JAXB生成的XML中?

时间:2010-06-17 22:08:07

标签: java jaxb

我有一个Java bean ala

@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>

有办法做到这一点吗?

2 个答案:

答案 0 :(得分: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字段。

答案 1 :(得分: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;
    }

}