2011-01-14 91 views
4

我編寫軟件的系統硬件通過硬件以樹結構物理連接。我們的應用程序中的數據模型是一棵樹。對於我們新的重寫,我們使用JAXB來創建數據模型。使用抽象基類來遍歷整個JAXB對象樹

我們有三種類型的設備,它們都共享一些屬性,所以我在XSD模式中創建了一個Abtract DeviceType。我的三個設備(推進器,切換器,接收器)都是從設備類型的XSD擴展這樣的:

<xs:complexType name="DeviceType" abstract="true"> 
    <xs:sequence> 
    <xs:element name="atrr1" type="xs:int"></xs:element> 
    <xs:element name="attr2" type="xs:int"></xs:element> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="PusherType"> 
    <xs:complexContent> 
    <xs:extension base="pts:DeviceType"> 
     <xs:sequence> 
     <xs:element name="Switcher" type="pts:SwitcherType" minOccurs="1"></xs:element> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:complexType name="SwitcherType"> 
    <xs:complexContent> 
    <xs:extension base="pts:DeviceType"> 
     <xs:sequence> 
     <xs:element name="switcher" type="pts:SwitcherType" minOccurs="1"></xs:element> 
     <xs:element name="receiver" type="pts:ReceiverType" minOccurs="1"></xs:element> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

推杆只有切換子元素和切換器可以同時切換器或接收器的孩子。接收者是行結束(葉節點)。 xjc構建類。我得到Unmarshaller來構造對象樹,但我無法弄清楚如何獲取getDevice()的getter方法。對於樹遍歷來說,我希望JAXB會提供類似「getChildren」的東西,但是我沒有在API中看到。如果我得到一個切換器對象,我有getSwitcher()和getReceiver()方法,但沒有getDevice()方法。但我試圖避免使用instanceof,當我做一個完整的樹遍歷。 xjc構建的Java代碼的確擴展了Device類,但我還沒有學會如何爲所有設備獲取通用的getter方法。我剛剛在兩天前開始使用Jaxb,並且我有很多瞭解Jaxb API的知識。

昨天是我第一次玩JAXB,我覺得這個工具很適合我們的系統。我們的硬件實際上是一棵樹,我們有多個部署,並且使用XML作爲我們的站點配置文件來構建狀態模型將是理想的。

對於JAXB新手的任何建議嗎?

回答

1

JAXB(JSR-222)是Java standard的對象映射到XML有幾種實現方式包括:MetroEclipseLink MOXy(我是技術主管),Apache JaxMe

JAXB設計映射現有對象結構轉換爲XML在你的例子中,你利用JAXB從XML模式生成類模型的能力,這就產生了類似於「類型化DOM」的東西,將有一個Java類匹配每個複雜類型(具有必要的繼承關係),以及與每個屬性/元素匹配的屬性。例如,以下類對應於SwitcherType複雜類型:

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "SwitcherType", propOrder = { 
    "switcher", 
    "receiver" 
}) 
public class SwitcherType extends DeviceType 
{ 

    @XmlElement(required = true) 
    protected SwitcherType switcher; 

    @XmlElement(required = true) 
    protected ReceiverType receiver; 

    public SwitcherType getSwitcher() { 
     return switcher; 
    } 

    public void setSwitcher(SwitcherType value) { 
     this.switcher = value; 
    } 

    public ReceiverType getReceiver() { 
     return receiver; 
    } 

    public void setReceiver(ReceiverType value) { 
     this.receiver = value; 
    } 

} 

與DOM不同,沒有通用的getChildren()方法。儘管你可以通過修改對象模型來實現這些。

有關JAXB的更多信息: