Использование абстрактного типа базового класса для обхода всего дерева объектов JAXB - PullRequest
4 голосов
/ 14 января 2011

Системное оборудование, для которого я пишу программное обеспечение, физически подключено через оборудование в древовидной структуре.Модель данных в нашем приложении - это Дерево.Для нашего нового переписывания мы используем JAXB для создания модели данных.

У нас есть три типа устройств, и все они имеют общие свойства некоторые , поэтому я сделал Abtract DeviceType вXSD схема.Все три моих устройства (Pushers, Switchers, Receivers) все расширяются от DeviceType в XSD следующим образом:

<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 имеют только дочерние элементы switcher, а switchers могут иметь как дочерние элементы switcher, так и получателя.Приемники - это конец линии (конечные узлы).xjc строит классы.Я получил Unmarshaller для создания дерева объектов, но я не могу понять, как получить метод получения для getDevice ().Для обхода дерева я надеялся, что JAXB предоставит что-то вроде «getChildren», но я не вижу в API.Если я получаю объект переключателя, у меня есть методы для getSwitcher () и getReceiver (), но нет метода getDevice ().Но я стараюсь избегать использования instanceof при полном обходе дерева.Java-код, который создает xjc, действительно выходит из класса Device, но я просто не узнал, как получить универсальный метод получения для всех устройств.Я только начал работать с Jaxb два дня назад, и у меня есть масса знаний об API Jaxb.

Вчера у меня был первый день игры с JAXB, я думаю, этот инструмент невероятно хорошо подходит нашей системе.Наше оборудование буквально является деревом, у нас есть несколько развертываний, и использование XML в качестве файла конфигурации нашего сайта для построения модели состояния было бы идеальным.

Есть предложения для новичка JAXB здесь?

1 Ответ

1 голос
/ 14 января 2011

JAXB ( JSR-222) - это стандарт Java для отображения объектов в XML.Существует несколько реализаций, включая: Metro , EclipseLink MOXy (я технический руководитель), Apache JaxMe и т. Д.

JAXB isпредназначен для отображения существующих структур объектов в 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:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...