2011-01-14 1 views
4

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

У нас есть три типа устройств, и все они разделяют некоторые свойства, поэтому я сделал Abtract DeviceType в схеме XSD. Мои три устройства (толкачи, переключатели, приемники) все простиралось от 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> 

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

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

Любые предложения для начинающего JAXB здесь?

ответ

1

JAXB (JSR-222) является Java standard для объектов отображения в XML Есть несколько реализаций, включая:. 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:

 Смежные вопросы

  • Нет связанных вопросов^_^