2013-10-29 75 views
2

考慮到給定的XSD架構:JAXB自定義綁定問題 - 序列屬性名稱

<xsd:complexType name="webCheckType"> 
    <xsd:sequence maxOccurs="unbounded"> 
     <xsd:element name="baseUrl" /> 
     <xsd:element name="beginAt" /> 
     <xsd:element name="gotoPage" /> 
    </xsd:sequence> 
    <xsd:attribute name="id" type="xsd:ID" use="required" /> 
    <xsd:attribute name="extends" type="xsd:IDREF" use="optional" /> 
    <xsd:attribute name="displayName" type="xsd:string" use="required" /> 
</xsd:complexType> 

XJC會產生這樣的事情:

@XmlElements({ 
    @XmlElement(name = "baseUrl", type = BaseUrl.class), 
    @XmlElement(name = "beginAt", type = BeginAt.class), 
    @XmlElement(name = "gotoPage", type = GotoPage.class) 
}) 
protected List<Object> baseUrlOrBeginAtOrGotoPage; 

我怎麼能在我的binding.xjb文件更改該屬性的名稱?

回答

1

使用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我沒有給這些元素的類型,但它應該在你的情況是好的。

+0

我已經嘗試過,但只適用於單個元素(例如重命名beginAt到其他的東西),但這不工作重命名列表屬性。 – fluminis

+0

查看我的更新與示例代碼。 – Shailendra

+1

感謝您的更新,但在您的示例中,您的序列中只有一個元素。我的問題是我的序列中有3個元素。 – fluminis