У меня есть следующий XSD-файл:
msg.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://xxx.yy/zz/cb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:cb="http://xxx.yy/zz/cb">
<xs:complexType name="message">
<xs:sequence>
<xs:element ref="cb:abstractGroup" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="baseType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="fullName" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="40" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="actualType1">
<xs:simpleContent>
<xs:extension base="cb:baseType">
<xs:attribute name="title" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="40" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="actualType2">
<xs:simpleContent>
<xs:extension base="cb:baseType">
<xs:attribute name="subject" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element type="cb:actualType1" name="actual1" substitutionGroup="cb:abstractGroup" />
<xs:element type="cb:actualType2" name="actual2" substitutionGroup="cb:abstractGroup" />
<xs:element name="abstractGroup" abstract="true" />
<xs:element name="msg" type="cb:message" />
</xs:schema>
Когда я генерирую Java-классы из этого XSD в IntellJ IDEA, используя JAXB, я получаюследующие классы:
- ActualType1
- ActualType2
- BaseType
- Сообщение
- ObjectFactory
Класс сообщения выглядит следующим образом:
Message.java
<code>package messages;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for message complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="message">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element ref="{http://xxx.yy/zz/cb}abstractGroup"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
*
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "message", namespace = "
http://xxx.yy/zz/cb", propOrder = {"abstractGroup"}) открытый класс Сообщение {@XmlElementRef (name = "abstractGroup", пространство имен = "
http://xxx.yy/zz/cb", type = JAXBElement.class) защищено JAXBElementabstractGroup;/ ** * Получает значение свойства abstractGroup.* * @return * возможным объектом является * {@link JAXBElement} {@ code <} {@ link Object} {@ code>} * {@link JAXBElement} {@ code <} {@ link ActualType1} {@ code>}* {@link JAXBElement} {@ code <} {@ link ActualType2} {@ code>} * * / public JAXBElementgetAbstractGroup () {return abstractGroup;} / ** * Устанавливает значение свойства abstractGroup.* * @param value * допустимым объектом является * {@link JAXBElement} {@ code <} {@ link Object} {@ code>} * {@link JAXBElement} {@ code <} {@ link ActualType1} {@ code>} * {@link JAXBElement} {@ code <} {@ link ActualType2} {@ code>} * * / public void setAbstractGroup (JAXBElementзначение) {this.abstractGroup = значение;}}
У меня есть образец файла msg.xml:
msg.xml
<cb:msg xmlns:cb="http://xxx.yy/zz/cb">
<cb:actual1 fullName="bla bla" title="kuku">anyType</cb:actual1>
</cb:msg>
После его отмены я хочуполучить реальный объект, представляющий тег actual1
.Я могу сделать следующее: message.getAbstractGroup (), но он возвращает экземпляр JAXBElement<?>
, который может быть либо JAXBElement<Object>
, либо JAXBElement<ActualType1>
, либо JAXBElement<ActualType2>
.
Теперь мои вопросы:
Как получить реальный объект типа ActualType1 или хотя бы BaseType или как преобразовать JAXBElement<?>
в ActualType1, ActualType2 или BaseType?