2

この XML を JAXB で実現するにはどうすればよいですか? 現在、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 + " ]";
    }

}
4

2 に答える 2

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
}
于 2012-09-04T09:21:05.273 に答える
1

クラスを使用して、expires 属性を持つブール値を表すことができます。XmlValue注釈は、要素のコンテンツとしてそのプロパティの 1 つを示すために使用されますが、別のプロパティには として注釈を付けることができますXmlAttribute

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

boolean次に、さまざまな許可メンバーの代わりにそのタイプを使用できます。このクラスを使用してCustomerオブジェクトにデータを格納するか、または他の方法で情報を格納し、その内部ストレージとBooleanWithExpiresXML 子要素の getter および setter の間でのみ変換するかは、ユーザー次第です。

コーディング スタイルにより適している場合は、コードを public メンバーから getter および setter に自由に変更してください。expiresまた、 に最も適した型を必ず使用してXMLGregorianCalendarください。expires必要に応じて、属性を必須として指定することもできます。

于 2012-09-04T09:22:58.330 に答える