Как получить схему JAXB, чтобы разрешить несколько имен элементов для одного класса @XmlRootElement

Это как бы противоположное направление таких вопросов, как No @XmlRootElement, созданный JAXB. В основном я хочу запустить схему и иметь два глобальных элемента одного типа.

<xs:element name="root1" type="tns:sameType"/>
<xs:element name="root2" type="tns:sameType"/>

Я понимаю, как упорядочивать вещи с помощью JAXBElement, но я не понимаю, как правильно сгенерировать схему. На мой взгляд, это выглядело бы примерно как следующий фрагмент (@XmlRootElements является вымышленным).

@XmlRootElements(value = {
    @XmlRootElement(name="root1", namespace="urn:example"),
    @XmlRootElement(name="root2", namespace="urn:example")
})

person Chase    schedule 13.02.2013    source источник


Ответы (1)


Вы можете использовать аннотацию @XmlElementDecl в классе с аннотацией @XmlRegistry.

Фабрика объектов

Аннотация @XmlElementDecl используется, когда типу соответствует несколько глобальных элементов. Аннотация размещается на create методах класса с аннотацией @XmlRegistry. Когда модель генерируется из XML-схемы, этот класс всегда называется ObjectFactory.

package forum14845035;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(name="root1")
    public JAXBElement<SameType> createRoot1(SameType sameType) {
        return new JAXBElement<SameType>(new QName("urn:example", "root1"), SameType.class, sameType);
    }

    @XmlElementDecl(name="root2")
    public JAXBElement<SameType> createRoot2(SameType sameType) {
        return new JAXBElement<SameType>(new QName("urn:example", "root2"), SameType.class, sameType);
    }

}

Тот же тип

В этом случае аннотации в классе предметной области не требуются.

package forum14845035;

public class SameType {

}

информация о пакете

Мы будем использовать аннотацию уровня пакета @XmlSchema, чтобы указать квалификацию пространства имен для нашей модели.

@XmlSchema(namespace="urn:example", elementFormDefault=XmlNsForm.QUALIFIED)
package forum14845035;

import javax.xml.bind.annotation.*;

Демо

package forum14845035;

import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(SameType.class, ObjectFactory.class);
        jc.generateSchema(new SchemaOutputResolver() {

            @Override
            public Result createOutput(String namespaceUri,
                    String suggestedFileName) throws IOException {
                StreamResult result = new StreamResult(System.out);
                result.setSystemId(suggestedFileName);
                return result;
            }

        });
    }

}

Вывод

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="urn:example" xmlns:tns="urn:example" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="root1" type="tns:sameType"/>

  <xs:element name="root2" type="tns:sameType"/>

  <xs:complexType name="sameType">
    <xs:sequence/>
  </xs:complexType>

</xs:schema>

Для получения дополнительной информации

person bdoughan    schedule 13.02.2013
comment
Отлично, спасибо. Я использовал jaxb.index и даже не думал смотреть на ObjectFactory как на возможный путь. - person Chase; 13.02.2013