我编写软件的系统硬件通过树形结构的硬件进行物理连接。我们的应用程序中的数据模型是树。对于我们的新重写,我们使用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新手的任何建议吗?
答案 0 :(得分:1)
JAXB(JSR-222)是用于将对象映射到XML的Java standard。有几个实现包括: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的更多信息: