Как генерировать Java-классы из нескольких XSD с общей схемой, используя Maven - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь создать классы Java из нескольких файлов XSD.Но я получаю эту ошибку.

org.xml.sax.SAXParseException;... 'somelement' уже определен

Я думаю, что это связано с общими типами, которые включались несколько раз.

Как я могу генерировать классы Java с помощью Maven?

У меня есть следующие схемы в каталоге:

xsd:

  • EXAMPLE_QualifyRS.xsd
  • EXAMPLE_QualifyRQ.xsd
  • EXAMPLE_Peble_CommonTypes.xs
  • EXAMPLE_CommonTypes.xsd
  • EXAMPLE_SimpleTypes.xsd

EXAMPLE_QualifyRS.xsd

<xs:schema xmlns="http://www.example.org/EXAMPLE/2007/00" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/EXAMPLE/2007/00" elementFormDefault="qualified" version="1.002" id="EXAMPLE2016.1">
    <xs:include schemaLocation="EXAMPLE_CommonTypes.xsd"/>
    <xs:include schemaLocation="EXAMPLE_SimpleTypes.xsd"/>
    <xs:include schemaLocation="EXAMPLE_Peble_CommonTypes.xsd"/>
         <xs:element name="someelement">...</xs:element>

EXAMPLE_Peble_CommonDy * 10 * 10 * 30

1032 *1032* 10* EXAMPLE_QualifyRQ.xsd

<xs:schema xmlns="http://www.example.org/EXAMPLE/2007/00" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/EXAMPLE/2007/00" elementFormDefault="qualified" version="1.001" id="EXAMPLE2016.1">
    <xs:include schemaLocation="EXAMPLE_CommonTypes.xsd"/>
    <xs:include schemaLocation="EXAMPLE_SimpleTypes.xsd"/>
    <xs:include schemaLocation="EXAMPLE_Peble_CommonTypes.xsd"/>
        <xs:element name="someelement">...</xs:element>

А вот как я генерирую свой класс в maven

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <id>example-schema</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>xjc</goal>
                        </goals>
                        <configuration>
                            <xsdPathWithinArtifact>xsd</xsdPathWithinArtifact>
                            <addGeneratedAnnotation>true</addGeneratedAnnotation>
                            <laxSchemaValidation>true</laxSchemaValidation>
                            <laxSchemaValidation>true</laxSchemaValidation>
                            <readOnly>true</readOnly>
                            <verbose>true</verbose>
                            <sources>
                                <source>src/main/resources/xsd</source>
                            </sources>
                            <packageName>com.example</packageName>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

1 Ответ

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

Предположим, у вас есть "Person" в вашем common.xsd, как показано ниже:

<xs:schema xmlns="common.schema.def"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="common.schema.def"
           elementFormDefault="qualified">

    <xs:complexType name="Person">
        <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="age" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

И вы хотите использовать его в другой схеме.Затем вы должны сделать:

<xs:schema xmlns="http://www.example.org/EXAMPLE/2007/00"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:common="common.schema.def"
           targetNamespace="http://www.example.org/EXAMPLE/2007/00"
           elementFormDefault="qualified">
    <xs:import namespace="common.schema.def" schemaLocation="common.xsd"/>

    <xs:complexType name="someClass">
        <xs:sequence>
            <xs:element name="person" type="common:Person"/>
            <xs:element name="alias" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Изменить, чтобы ответить на комментарий:

Конфликт имен происходит, потому что вы указываете имя пакета в плагине.Затем классы с тем же именем пытаются поместить в один и тот же пакет.Давайте удалим наименование пакета из плагина и используем привязки для создания желаемого пакета для каждой схемы.

Ваш плагин будет выглядеть так:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>example-schema</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <xsdPathWithinArtifact>xsd</xsdPathWithinArtifact>
                <addGeneratedAnnotation>true</addGeneratedAnnotation>
                <laxSchemaValidation>true</laxSchemaValidation>
                <laxSchemaValidation>true</laxSchemaValidation>
                <readOnly>true</readOnly>
                <verbose>true</verbose>
                <sources>
                    <source>src/main/resources/xsd</source>
                </sources>
                <xjbSources>
                    <xjbSource>src/main/resources/xjb</xjbSource>
                </xjbSources>
            </configuration>
        </execution>
    </executions>
</plugin>

И bindings.xjb будет выглядеть так:

<jxb:bindings version="1.0"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="../xsd/common.xsd">
        <jxb:schemaBindings>
            <jxb:package name="common.packagename"/>
        </jxb:schemaBindings>
    </jxb:bindings>
    <jxb:bindings schemaLocation="../xsd/someothercommon.xsd">
        <jxb:schemaBindings>
            <jxb:package name="othercommon.packagename"/>
        </jxb:schemaBindings>
    </jxb:bindings>
</jxb:bindings>

Чтобы проверить это, я использовал другой xsd с элементом с именем Person, который выглядит следующим образом:

<xs:schema xmlns="othercommon.schema.def"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="othercommon.schema.def"
           elementFormDefault="qualified">

    <xs:complexType name="Person">
        <xs:sequence>
            <xs:element name="alias" type="xs:string"/>
            <xs:element name="id" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

И схема, которая использует оба, обновлена ​​до этого:

<xs:schema xmlns="http://www.example.org/EXAMPLE/2007/00"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:common="common.schema.def"
           xmlns:othercommon="othercommon.schema.def"
           targetNamespace="http://www.example.org/EXAMPLE/2007/00"
           elementFormDefault="qualified">
    <xs:import namespace="common.schema.def" schemaLocation="common.xsd"/>
    <xs:import namespace="othercommon.schema.def" schemaLocation="someothercommon.xsd"/>

    <xs:complexType name="someClass">
        <xs:sequence>
            <xs:element name="person" type="common:Person"/>
            <xs:element name="otherpersontype" type="othercommon:Person"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
...