如何在JAXB中向Element添加Attribute

时间:2014-10-31 13:55:47

标签: java xml jaxb

我是JAXB库的新手,无法获得将@XmlAttribute添加到现有代码的解决方案。

我有一个XML,它有两个元素(Name和Value),如下所示:

<ns4:Envelope xmlns:ns2="xyz/123" xmlns:ns3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns4="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns6="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns5="http://www.w3.org/2001/XMLSchema" xmlns:abc="abc">
    <ns4:Header>
        <ns2:ID ns4:mustUnderstand="1">testId</ns2:ID>
    </ns4:Header>
    <ns4:Body>
        <ns2:Set>
            <List ns3:arrayType="abc:hash[1]">
                <Struct>
                    <Name>Interval</Name>
                    <Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:int">10</Value>
                </Struct>
            </List>
        </ns2:Set>
    </ns4:Body>
</ns4:Envelope>

在上面的XML中,xsi:type已由JAXB自动生成。具有以下代码的Struct类

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Struct", propOrder = {
    "name",
    "value"
})
public class Struct {

    @XmlElement(name = "Name", required = true)
    protected String name;
    @XmlElement(name = "Value", required = true)
    protected Object value;

    public String getName() {
        return name;
    }
    public void setName(String value) {
        this.name = value;
    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }

如您所见,上述类中未设置类型。我想要根据用户定义添加类型,而不是根据数据类型生成类型。

我不知道如何向此Struct类添加属性,可以将类型添加到“值”元素(因为我们可以看到值元素是简单字符串对象)

2 个答案:

答案 0 :(得分:0)

如果您只想要type属性,请尝试以下方法:

public class TypedValue {

    @XmlAttribute
    protected String type;
    @XmlValue
    protected String value;
}

而不是Object中的Struct.value

xsi:type是继承的一个非常特殊的东西。

答案 1 :(得分:0)

如果您想自定义JAXB表示的内容,您可以随时为其创建XmlAdapter

调整字段/属性

@XmlJavaTypeAdatper注释用于引用XmlAdapter

@XmlElement(name = "Value", required = true)
@XmlJavaTypeAdapter(ValueAdapter.class)
protected Object value;

<强> XmlAdapter

负责在您的域模型中的真实对象与您想要编组的对象之间进行转换,以获得所需的XML。

public class ValueAdapter extends XmlAdapter<MyAdaptedObject, Object> {
    ...
}

<强> MyAdaptedObject

是一个POJO,它将编组你想要的XML。