Как заставить два XSD использовать один и тот же пользовательский объект - PullRequest
3 голосов
/ 02 января 2012

Я использую плагин JAXB и intellij webservices для создания java-файлов из XSD.У меня есть два XSD, которые определяют один и тот же объект, но когда я создаю их, используя «генерировать код Java из схемы XML», объект создается дважды с его собственным пакетом.Я уже пробовал с импортом xsd и использованием атрибута ref, и я получаю тот же результат.

Вот пример:

Это первый XSD

<?xml version="1.0" encoding="UTF-8"?>
   <xs:schema targetNamespace="http://www.msp-gs.com/workflow"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
       xmlns:wc="http://www.example.com/workflow"
       attributeFormDefault="unqualified"
       elementFormDefault="qualified"
       jaxb:version="1.0">

    <xs:annotation>
    <xs:appinfo>
        <jaxb:globalBindings enableJavaNamingConventions="true">

        </jaxb:globalBindings>
    </xs:appinfo>
    </xs:annotation>

    <xs:element name="WC">

    <xs:complexType>

        <xs:sequence>

            <xs:element name="Example"
                        type="wc:Restriction"
                        minOccurs="1"
                        maxOccurs="unbounded">

            </xs:element>

        </xs:sequence>

        </xs:complexType>

    </xs:element>

    <xs:complexType name="Restriction">

        <xs:attribute type="xs:string"
                  name="authorizationTreeId"/>

    </xs:complexType>

    </xs:schema>

Thisэто второй XSD

    <?xml version="1.0" encoding="UTF-8"?>
     <xs:schema targetNamespace="http://www.msp-gs.com/workflow"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
       xmlns:fd="http://www.example.com/workflow"
       attributeFormDefault="unqualified"
       elementFormDefault="qualified"
       jaxb:version="1.0">

      <xs:annotation>
        <xs:appinfo>
        <jaxb:globalBindings enableJavaNamingConventions="true">

        </jaxb:globalBindings>
    </xs:appinfo>
      </xs:annotation>

    <xs:element name="FD">

        <xs:complexType>

        <xs:sequence>

            <xs:element name="Example"
                        type="fd:Restriction"
                        minOccurs="1"
                        maxOccurs="unbounded">

            </xs:element>

        </xs:sequence>

    </xs:complexType>

    </xs:element>

    <xs:complexType name="Restriction">

    <xs:attribute type="xs:string"
                  name="authorizationTreeId"/>

    </xs:complexType>

     </xs:schema>

Я хочу, чтобы Ограничение было тем же объектом.

Спасибо.

1 Ответ

3 голосов
/ 02 января 2012

Вы можете указать JAXB использовать существующий класс Java вместо генерации с использованием внешнего файла привязки, как показано ниже. В приведенном ниже примере мы говорим JAXB использовать существующий класс Product:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bindings version="2.1" xmlns="http://java.sun.com/xml/ns/jaxb">
  <bindings scd="x-schema::tns"
    xmlns:tns="http://www.example.org/Product">
    <schemaBindings map="false"/>
    <bindings scd="tns:product">
      <class ref="org.example.product.Product"/>
    </bindings>
  </bindings>
</bindings>

Если вы используете инструмент XJC для генерации классов из схемы XML, вы можете использовать флаг -episode, чтобы XJC генерировал файл привязки, указывающий на все сгенерированные им классы. Это позволит вам повторно использовать ранее созданные классы.

xjc -d out -episode product.episode Product.xsd

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

...