繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM