使用JAXB綁定自定義,您可以使用XPath指定具有特定名稱的節點並自定義其屬性名稱。該代碼將類似於這樣(沒有測試過,但你的想法)
<jxb:bindings node=".//xs:element[@name='name']">
<jxb:property name="toName"/>
</jxb:bindings>
這是我的示例XSD - customer.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element
name="phone-number"
type="xsd:string"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
在這個模式運行XJC創建下面的類
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"phoneNumber"
})
@XmlRootElement(name = "customer")
public class Customer {
@XmlElement(name = "phone-number", required = true)
protected List<String> phoneNumber;
public List<String> getPhoneNumber() {
if (phoneNumber == null) {
phoneNumber = new ArrayList<String>();
}
return this.phoneNumber;
}
現在我已創建一個自定義綁定
<jxb:bindings schemaLocation="customer.xsd">
<jxb:bindings node="//xs:element[@name='customer']/xs:complexType/xs:sequence/xs:element[@name='phone-number']">
<!--<jxb:property name="" collectionType="java.util.LinkedList"/>-->
<jxb:property name="number"/>
</jxb:bindings>
</jxb:bindings>
在這裏,我已經改變了列表屬性的名稱爲「數字」
當我與此結合運行XJC,我與列表屬性正確更新以下Customer類
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"number"
})
@XmlRootElement(name = "customer")
public class Customer {
@XmlElement(name = "phone-number", required = true)
protected List<String> number;
public List<String> getNumber() {
if (number == null) {
number = new ArrayList<String>();
}
return this.number;
}
有了您的架構,你可以試試下面給你自己的屬性名
<jxb:bindings node="//xs:complexType/xs:sequence[xs:element[@name='baseUrl' or @name='beginAt' or @name='gotoPage']]">
<jxb:property name="yourpropertyname"/>
</jxb:bindings>
您模式運行這個給
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "webCheckType", propOrder = {
"number"
})
public class WebCheckType {
@XmlElementRefs({
@XmlElementRef(name = "beginAt", type = JAXBElement.class),
@XmlElementRef(name = "gotoPage", type = JAXBElement.class),
@XmlElementRef(name = "baseUrl", type = JAXBElement.class)
})
protected List<JAXBElement<Object>> number;
@XmlAttribute(required = true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlID
@XmlSchemaType(name = "ID")
protected String id;
@XmlAttribute(name = "extends")
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected Object _extends;
@XmlAttribute(required = true)
protected String displayName;
........................
.......................
public List<JAXBElement<Object>> getNumber() {
if (number == null) {
number = new ArrayList<JAXBElement<Object>>();
}
return this.number;
}
當然,在我的情況下,它的JAXBElement因爲在我的XSD我沒有給這些元素的類型,但它應該在你的情況是好的。
我已經嘗試過,但只適用於單個元素(例如重命名beginAt到其他的東西),但這不工作重命名列表屬性。 – fluminis
查看我的更新與示例代碼。 – Shailendra
感謝您的更新,但在您的示例中,您的序列中只有一個元素。我的問題是我的序列中有3個元素。 – fluminis