这与我昨天问过的this question和this question有些相关。
我想使用布尔值来确定XML文档中是否存在元素。我正在解析的文件允许使用以下元素:
<FamilyMember>
<Name>Jeff</Name>
</FamilyMember>
<FamilyMember>
<Name>Spot</Name>
<IsPet/>
</FamilyMember>
在此示例中,元素指定FamilyMember是宠物,但没有与此元素关联的其他数据。我希望能够告诉JAXB根据解析文件中是否存在该元素返回一个布尔值。如果元素存在,则值应为true;否则,它应该是假的。我想在XSD架构中使用它来生成我的Java类,如果可能的话。
答案 0 :(得分:3)
您应该可以使用类似于以下内容的XmlAdapter执行此操作:
获得(How do I specify the adapter(s) which JAXB uses for marshaling/unmarshaling data?)答案后,您就可以应用适配器了。
以下是如何做到的。请注意,以下示例使用EclipseLink JAXB (MOXy),但在使用JAXB参考实现时会引发异常。
<强> FamilyMember 强>
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);
}
}
答案 1 :(得分:0)
您的IsPet是否显示为布尔值?在我的情况下,我猜如果它不存在于XML中,则布尔值将为null。我认为this question表明情况就是这样。