jaxb:将属性绑定到元素

时间:2012-09-04 09:14:28

标签: java jaxb xml-binding

如何使用JAXB实现此XML?目前grantA,C,B元素中的expires属性不受限制 - 但它应该是有限的。我不知道如何将元素与属性相关联。我是否必须为每个grantA,C,B创建类? XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <customers>
        <customer>
            <name>C1</name>
            <grantA expires="">false</grantA>
            <grantB expires="">true</grantB>
            <grantC expires="">true</grantC>
        </customer>
        <customer>
            <name>C2</name>
            <grantA expires="">false</grantA>
            <grantB expires="">true</grantB>
            <grantC expires="">true</grantC>
        </customer>
        <customer>
            <name>C3</name>
            <grantA expires="">false</grantA>
            <grantB expires="">true</grantB>
            <grantC expires="">false</grantC>
        </customer>
    </customers>

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="name" type="xs:string" />

    <xs:element name="grantA" type="xs:boolean" />
    <xs:element name="grantB" type="xs:boolean" />
    <xs:element name="grantC" type="xs:boolean" />

    <xs:element name="customers" type="customers" />
    <xs:element name="customer">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name" />
                <xs:element name="grantA">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="expires" type="xs:string" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
                <xs:element name="grantB">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="expires" type="xs:string" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
                <xs:element name="grantC">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="expires" type="xs:string" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="customers">
        <xs:sequence>
            <xs:element ref="customer" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

我目前的状态是:

Customers.java:

@XmlRootElement(name = "customers")
public class Customers
{
    private List<Customer>  customerList;

    @XmlElement(name = "customer")
    public List<Customer> getCustomerList()
    {
        if (null == customerList)
        {
            customerList = new ArrayList<Customer>();
        }
        return customerList;
    }

    public void setCustomerList(List<Customer> customers)
    {
        this.customerList = customers;
    }

}

Customer.java

@XmlRootElement(name = "customer")
@XmlType(propOrder = { "name", "grantA", "grantB", "grantC" })
public class Customer
{
    private String  name = "";
    private boolean grantA;
    private boolean grantB;
    private boolean grantC;

    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)   
    @XmlElement(name = "name", required=true)
    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    @XmlElement(name = "grantA", required=true)
    public boolean isGrantA()
    {
        return grantA;
    }

    public void setGrantA(boolean grantA)
    {
        this.grantA = grantA;
    }



    @XmlElement(name = "grantB", required=true)
    public boolean isGrantB()
    {
        return grantB;
    }

    public void setGrantB(boolean grantB)
    {
        this.grantB = grantB;
    }

    @XmlElement(name = "grantC", required=true)
    public boolean isGrantC()
    {
        return grantC;
    }

    public void setGrantC(boolean grantC)
    {
        this.grantC = grantC;
    }


    @Override
    public String toString()
    {
        return "" + name + "[ " + grantA + ", " + grantB + " " + grantC + " ]";
    }

}

2 个答案:

答案 0 :(得分:3)

您可以创建一个类Grant,如下所示:

@XmlType
public class Grant {
    @XmlAttribute
    private String expires;

    @XmlValue
    private boolean value;

    //getters and setters
}

并在Customer类中使用不同的名称映射它,如下所示:

public class Customer
{
    private String  name = "";
    @XmlElement(name="grantA");
    private Grant grantA;

    @XmlElement(name="grantB");
    private Grant grantB;

    @XmlElement(name="grantC");
    private Grant grantC;

    //rest of the code
}

答案 1 :(得分:1)

您可以使用类来表示具有expires属性的布尔值。 XmlValue注释用于表示其中一个属性作为元素的内容,而另一个属性可以注释为XmlAttribute

@XmlType
class BooleanWithExpires {
    @XmlValue public boolean value;
    @XmlAttribute public String expires;
}

然后,您可以为不同的授权成员使用该类型而不是boolean。是否要使用此类将数据存储在Customer对象中,或者以其他方式存储信息并仅在内部存储和BooleanWithExpires之间进行转换,由您自行决定。 XML子元素的getter和setter。

如果更符合您的编码风格,请随意将代码从公共成员更改为getter和setter。另外,请确保使用最适合expires的任何类型,例如XMLGregorianCalendar。如果这适合您,您可能还需要根据需要表示expires属性。