簡體   English   中英

使用抽象基類類型遍歷整個JAXB對象樹

[英]Using Abstract base class type to traverse entire JAXB Object tree

我編寫軟件的系統硬件通過樹形結構的硬件物理連接。 我們的應用程序中的數據模型是樹。 對於我們的新重寫,我們使用JAXB來創建數據模型。

我們有三種類型的設備,它們都共享一些屬性,因此我在XSD架構中創建了一個Abtract DeviceType。 我的三個設備(Pushers,Switchers,Receivers)都是從XSD中的DeviceType擴展而來的,如下所示:

<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>

Pushers只有切換器子元素,切換器可以有切換器或接收器子。 接收器是線路的末端(葉子節點)。 xjc構建類。 我得到了Unmarshaller來構造對象樹,但我無法弄清楚如何獲取getDevice()的getter方法。 對於樹遍歷,我希望JAXB提供類似“getChildren”的東西,但我沒有在API中看到。 如果我得到一個切換器對象,我有getSwitcher()和getReceiver()方法,但沒有getDevice()方法。 但是當我進行完整的樹遍歷時,我正試圖避免使用instanceof xjc構建的Java代碼確實從Device類擴展,但我還沒有學會如何為所有設備獲取通用的getter方法。 我兩天前剛剛開始使用Jaxb,我有點了解Jaxb API。

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

對JAXB新手有什么建議嗎?

JAXB( JSR-222)是將對象映射到XML的Java 標准 有幾個實現包括: 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的更多信息:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM