tree - 使用抽象基类类型遍历整个 JAXB 对象树

标签 tree jaxb abstract-class tree-traversal

我为其编写软件的系统硬件通过树结构中的硬件进行物理连接。我们应用程序中的数据模型是一棵树。对于我们的新重写,我们使用 JAXB 创建数据模型。

我们有三种类型的设备,它们都共享一些属性,所以我在 XSD 模式中创建了一个抽象设备类型。我的三个设备(推送器、切换器、接收器)都是从 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>

Pusher 只有 switcher 子元素,而 switcher 可以同时有 switcher 或 receiver 子元素。接收者是线路的末端(叶节点)。 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 standard。有几种实现,包括: 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 的更多信息:
  • http://blog.bdoughan.com/
  • 关于tree - 使用抽象基类类型遍历整个 JAXB 对象树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4693159/

    相关文章:

    c++ - 具有抽象中间类的虚拟继承

    sql - 在 oracle 树查询中加入其他表

    c - 是否可以制作一个指向结构(节点)的指针数组?

    inheritance - Swift 语言中的抽象类

    c# - 抽象工厂模式

    java - JAXB 中不区分大小写的 XMLEnumValue

    c++ - 在树结构中搜索数据

    list - 无法理解 Haskell 树

    spring - 使用 JAXB + Spring RESTful Web 服务防止 XXE(外部实体处理)攻击

    java - JAXB 解码问题