如何使用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 + " ]";
}
}
答案 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
属性。