我是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类添加属性,可以将类型添加到“值”元素(因为我们可以看到值元素是简单字符串对象)
答案 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。