2010-11-02 76 views
1

我想寫我的第一個xsd,它將有從它生成的JAXB映射POJO,用於web服務。將有三個相關的類,我想看到XML作爲表達...如何在複雜類型中重複使用註釋?

<stringKey systemName="string key 1" businessName="Customer">Glorious strings</stringKey> 
<numberKey systemName="number key 1" businessName="Invoice number">1025.52</numberKey> 
<dateKey systemName="date key 1" businessName="Invoice date">1970-01-01</dateKey> 

我試圖使JAXB生成的POJO可以屬於同一接口重用註解的聲明。到目前爲止,我有以下XSD ...

<xs:complexType name="dateKey"> 
    <xs:simpleContent> 
     <xs:extension base="namedElement"> 
      <xs:attribute type="xs:dateTime" name="keyValue" /> 
     </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 
<xs:complexType name="namedElement" abstract="true"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
      <xs:attribute type="xs:string" name="businessName" /> 
      <xs:attribute type="xs:string" name="systemName" /> 
     </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 

這讓我有一部分的方式,它給我的XML像...

<dateKey systemName="date key 1" businessName="Invoice date"><keyValue>1970-01-01</keyValue></dateKey> 

我有困難重用類型的聲明註解,同時覆蓋該類型的基礎。 (注意我試圖擺脫上面例子中的'keyValue'元素)。有任何想法嗎?

編輯:我注意到了XSD片斷不驗證下面的XML片段 - 這似乎已經在重構已經輸了,但我希望你明白了吧...

回答

1

我發現你可以使用「attributeGroup」提取共同屬性創建XSD像...

<xs:complexType name="dateKey"> 
    <xs:simpleContent> 
     <xs:extension base="xs:dateTime"> 
      <xs:attributeGroup ref="namedElement" /> 
     </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 
<xs:attributeGroup name="namedElement"> 
    <xs:attribute type="xs:string" name="businessName" /> 
    <xs:attribute type="xs:string" name="systemName" /> 
</xs:attributeGroup> 

這讓我再次使用過類似的元素屬性,但是生成的POJO不共享一個共同的抽象超類。我想我會停止自動生成POJO,並且用手建立XSD和POJO,儘管我有點擔心兩者之間的差異。

+0

決定不要單獨維護模式和pojos,反思這是一個瘋狂的想法。我只是刪除了屬性並將常用元素提取爲基本類型。在xml中看起來不太漂亮,但代碼生成現在可以在.net和java中使用(使用超類)。 – 2010-12-02 13:07:30

0

爲什麼不從Java啓動類並執行以下操作。您將需要標記父類@XmlTransient有事情正常工作:

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlTransient; 

@XmlTransient 
public class NamedElement { 

    private String businessName; 
    private String systemName; 

    @XmlAttribute 
    public String getBusinessName() { 
     return businessName; 
    } 

    public void setBusinessName(String businessName) { 
     this.businessName = businessName; 
    } 

    @XmlAttribute 
    public String getSystemName() { 
     return systemName; 
    } 

    public void setSystemName(String systemName) { 
     this.systemName = systemName; 
    } 

} 

而子類將如下所示:

import java.util.Date; 

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlSchemaType; 
import javax.xml.bind.annotation.XmlValue; 

@XmlRootElement 
public class DateKey extends NamedElement { 

    private Date value; 

    @XmlValue 
    @XmlSchemaType(name="date") 
    public Date getValue() { 
     return value; 
    } 

    public void setValue(Date value) { 
     this.value = value; 
    } 

} 

然後將以下代碼:

import java.io.File; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(DateKey.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     DateKey dateKey = (DateKey) unmarshaller.unmarshal(new File("input.xml")); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.marshal(dateKey, System.out); 
    } 

} 

將處理您的文檔:

<dateKey systemName="date key 1" businessName="Invoice date">1970-01-01</dateKey> 
+0

感謝您的幫助 - 您的示例工程,但生成的xsd不共享共同的attributeGroup(我相信這將有助於.NET interop /易用性)。我決定用手寫的xsd來使用你的映射,並且保持我的手指在兩者之間沒有滑動。 – 2010-11-03 10:38:30