[英]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 標准 。 有幾個實現包括: Metro , EclipseLink 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.