Как получить фактический объект абстрактного элемента XML в Java - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующий 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>
 * &lt;complexType name="message">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{http://xxx.yy/zz/cb}abstractGroup"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/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?

1 Ответ

0 голосов
/ 15 октября 2018

Ответ примерно такой:

BaseType type = (BaseType) message.getAbstractGroup().getValue();

if (type instanceof ActualType1) {
     System.out.println(((ActualType1) type).getTitle());
} else if (type instanceof ActualType2) {
     System.out.println(((ActualType2) type).getSubject());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...