我编写软件的系统硬件是通过硬件以树形结构物理连接的。我们应用程序中的数据模型是一个树。对于我们的新重写,我们使用 JAXB 创建数据模型。
我们有三种类型的设备,它们都共享一些属性,所以我在 XSD 模式中创建了一个抽象设备类型。我的三个设备(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>
推送器只有切换器子元素,而切换器可以同时具有切换器或接收器子元素。接收器是行的末端(叶节点)。xjc 构建类。我得到了 Unmarshaller 来构造对象树,但我不知道如何为 getDevice() 获取 getter 方法。对于树遍历,我希望 JAXB 能提供类似“getChildren”的东西,但我没有在 API 中看到。如果我得到一个切换器对象,我有 getSwitcher() 和 getReceiver() 的方法,但没有 getDevice() 方法。但我试图避免使用instanceof当我进行完整的树遍历时。xjc 构建的 Java 代码确实从 Device 类扩展而来,但我还没有学会如何为所有设备获取通用 getter 方法。两天前我刚开始使用 Jaxb,我有很多东西要学习 Jaxb API。
昨天是我玩 JAXB 的第一天,我认为这个工具非常适合我们的系统。我们的硬件实际上是一棵树,我们有多个部署,使用 XML 作为我们的站点配置文件来构建状态模型将是理想的。
这里对 JAXB 新手有什么建议吗?