[英]How do I assign a boolean value based on the existence of an element in JAXB?
我想使用布尔值来确定XML文档中是否存在元素。 我正在解析的文件允许使用以下元素:
<FamilyMember>
<Name>Jeff</Name>
</FamilyMember>
<FamilyMember>
<Name>Spot</Name>
<IsPet/>
</FamilyMember>
在此示例中,元素指定FamilyMember是宠物,但没有与此元素关联的其他数据。 我希望能够告诉JAXB根据解析文件中是否存在该元素返回一个布尔值。 如果元素存在,则值应为true; 否则,它应该是假的。 我想在XSD架构中使用它来生成我的Java类,如果可能的话。
您应该能够使用类似于以下内容的XmlAdapter执行此操作:
一旦得到答案( 如何指定JAXB用于编组/解组数据的适配器? ),您就可以应用适配器。
以下是如何做到的。 请注意,以下示例使用EclipseLink JAXB(MOXy) ,但在使用JAXB参考实现时会引发异常。
家庭成员
package example;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement(name="FamilyMember")
public class FamilyMember {
private boolean pet;
private String name;
@XmlElementRef
@XmlJavaTypeAdapter(IsPetAdapter.class)
public boolean isPet() {
return pet;
}
public void setPet(boolean pet) {
this.pet = pet;
}
@XmlElement(name="Name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
IsPetAdapter
package example;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import forum204.IsPetAdapter.IsPet;
public class IsPetAdapter extends XmlAdapter<IsPet, Boolean> {
@Override
public Boolean unmarshal(IsPet v) throws Exception {
return null != v;
}
@Override
public IsPet marshal(Boolean v) throws Exception {
if(v) {
return new IsPet();
}
return null;
}
@XmlRootElement(name="IsPet")
public static class IsPet {
}
}
演示
package example;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(FamilyMember.class);
Unmarshaller unmarshaller= jc.createUnmarshaller();
FamilyMember fm = (FamilyMember) unmarshaller.unmarshal(new File("input.xml"));
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(fm, System.out);
}
}
您的IsPet是否显示为布尔值? 在我的情况下,我猜如果它不存在于XML中,则布尔值将为null。 我认为这个问题表明情况就是这样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.