如何基于JAXB中元素的存在来分配布尔值?

时间:2011-05-11 19:01:54

标签: java xml jaxb

这与我昨天问过的this questionthis question有些相关。

我想使用布尔值来确定XML文档中是否存在元素。我正在解析的文件允许使用以下元素:

<FamilyMember>
    <Name>Jeff</Name>
</FamilyMember>
<FamilyMember>
    <Name>Spot</Name>
    <IsPet/>
</FamilyMember>

在此示例中,元素指定FamilyMember是宠物,但没有与此元素关联的其他数据。我希望能够告诉JAXB根据解析文件中是否存在该元素返回一个布尔值。如果元素存在,则值应为true;否则,它应该是假的。我想在XSD架构中使用它来生成我的Java类,如果可能的话。

2 个答案:

答案 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表明情况就是这样。