我是JAXB的新手,我想做一些我不知道是否可行的事情。我有一个像这样编组的java类:
@XmlAccessorType(XMLAccessType.NONE)
public class MyClass {
@XmlElement
private String a = "x";
@XmlElement
private String b = "xx";
@XmlElement
private boolean c = true;
...
}
并希望XML输出如下:
<?xml ...?>
<MyClass>
<a>x</a>
<b>xx</b>
<c value="true"/>
</MyClass>
我想到的一个解决方案是使用布尔包装类来使其工作,但我想避免这种情况,因为它使我无法使用布尔原语true,false。
我们可以在JAXB中这样做吗?
答案 0 :(得分:3)
XmlAdapter
您可以创建XmlAdapter
来获取您要查找的行为。 XmlAdapter
将域对象转换为另一种类型,以便进行编组和解组。
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class BooleanAdapter extends XmlAdapter<BooleanAdapter.AdaptedBoolean, Boolean> {
public static class AdaptedBoolean {
@XmlAttribute
public boolean value;
}
@Override
public Boolean unmarshal(AdaptedBoolean adaptedBoolean) throws Exception {
return adaptedBoolean.value;
}
@Override
public AdaptedBoolean marshal(Boolean v) throws Exception {
AdaptedBoolean adaptedBoolean = new AdaptedBoolean();
adaptedBoolean.value = v;
return adaptedBoolean;
}
}
XmlAdapter
要使用XmlAdapter
,您的映射字段必须是Boolean
类型,而不是boolean
。如果您愿意,您的访问者方法仍然可以是boolean
。
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlAccessorType(XmlAccessType.NONE)
public class MyClass {
@XmlElement
private String a = "x";
@XmlElement
private String b = "xx";
@XmlElement
@XmlJavaTypeAdapter(BooleanAdapter.class)
private Boolean c = true;
public boolean getC() {
return c;
}
public void setC(boolean c) {
this.c = c;
}
}
答案 1 :(得分:0)
您班级的XML输出是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass>
<a>x</a>
<b>xx</b>
<c>true</c>
</myClass>
如果您希望boolean
值导致
<c value="true" />
然后你需要boolean c
字段周围的包装元素。这可以是Boolean
类型或其中包含boolean c
的其他自定义类型,并标有@XmlAttribute
。
示例:强>
class MyBool {
@XmlAttribute(name="value")
private boolean c = true;
}
@XmlAccessorType(XmlAccessType.NONE)
class MyClass {
@XmlElement
private String a = "x";
@XmlElement
private String b = "xx";
@XmlElement
private MyBool c = new MyBool();
}
<强>输出:强>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass>
<a>x</a>
<b>xx</b>
<c value="true"/>
</myClass>
如果您不想使用包装器,仍然可以使用boolean c
注释@XmlAttribute
,如下所示:
@XmlAttribute(name="value")
private boolean c = true;
但是它将呈现为包装器类的属性,在本例中为MyClass
,因此输出将为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass value="true">
<a>x</a>
<b>xx</b>
</myClass>