Может ли Castor обрабатывать генерацию классов из нескольких XSD, импортируемых из базовой XSD? - PullRequest
3 голосов
/ 02 ноября 2011

У меня есть несколько XSD, которые используют одни и те же объекты. Например, оба XSD для ProductPurchaseRequest.xsd и ProductQuoteRequest.xsd имеют тег <product> для описания рассматриваемого продукта. По этой причине я создал файл Product.xsd для определения тега <product> и оба ProductPurchaseRequest.xsd и ProductQuoteRequest.xsd импортировали Product.xsd с `.

Я хотел бы использовать Castor для генерации Java-классов из этих XSD, и чтобы они оба использовали один и тот же класс для представления Product, чтобы я мог повторно использовать одну и ту же логику для сопоставления их с ProductModel нашей модели класс.

Может ли Кастор сделать это? Если это так, какой будет синтаксис задачи Ant для него. Если нет, возможно, JAXB будет лучшей альтернативой?

Ответы [ 2 ]

6 голосов
/ 02 ноября 2011

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222) экспертная группа.

Может ли Кастор сделать это?Если это так, какой будет синтаксис задачи Ant для него.Если нет, то возможно, JAXB будет лучшей альтернативой?

Ниже приведен пример того, как это можно сделать с помощью JAXB:

Product

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/Product" 
    xmlns:tns="http://www.example.org/Product" 
    elementFormDefault="qualified">
    <element name="product">
        <complexType>
            <sequence>
                <element name="id" type="string"/>
                <element name="name" type="string"/>
            </sequence>
        </complexType>
    </element>
</schema>

Поскольку несколько XML-схем импортируют Product.xsd, мы можем использовать файлы эпизодов, чтобы классы, соответствующие Product.xsd, создавались только один раз.

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

ProductPurchaseRequest.xsd

Ниже приведен пример схемы XML, которая импортирует Product.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/ProductPurchaseRequest" 
    xmlns:tns="http://www.example.org/ProductPurchaseRequest"
    xmlns:prod="http://www.example.org/Product" 
    elementFormDefault="qualified">
    <import namespace="http://www.example.org/Product" schemaLocation="Product.xsd"/>
    <element name="purchase-request">
        <complexType>
            <sequence>
                <element ref="prod:product" maxOccurs="unbounded"/>
            </sequence>
        </complexType>
    </element>
</schema>

Когда мы генерируем классы из этой схемы XML, мы будем ссылаться на файл эпизода, который мысозданный, когда мы сгенерировали классы Java из Product.xsd.

xjc -d out ProductPurchaseRequest.xsd -extension -b product.episode

ProductQuoteRequest.xsd

Ниже приведен еще один пример схемы XML, которая импортирует Product.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/ProductQuoteRequest" 
    xmlns:tns="http://www.example.org/ProductQuoteRequest" 
    xmlns:prod="http://www.example.org/Product" 
    elementFormDefault="qualified">
    <import namespace="http://www.example.org/Product" schemaLocation="Product.xsd"/>
    <element name="quote">
        <complexType>
            <sequence>
                <element ref="prod:product"/>
            </sequence>
        </complexType>
    </element>
</schema>

Опять же, когда мы сгенерируем классы из этой схемы XML, мы будем ссылаться на файл эпизода, который мы создали при создании классов Java из Product.xsd.

xjc -d out ProductQuoteRequest.xsd -extension -b product.episode

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

1 голос
/ 03 ноября 2011

Так что я смог заставить все это работать, используя эталонную реализацию JAXB.Хитрость заключалась в том, чтобы понять, что загрузка с сайта JAXB является загрузчиком и , а не настоящими библиотеками!Дважды щелкните, чтобы принять лицензию, и библиотеки будут загружены локально.Создал тестовую папку (JAXB_TEST) и скопировал все загруженные .jar s в подпапку lib.Я положил все свои XSD в подпапку XSD.После этого я запустил следующий файл Ant build.xml.

<?xml version="1.0"?>
<project name="jaxb_test" basedir="." default="package" >

    <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
        <classpath>
            <fileset dir="./lib" includes="*.jar" />
        </classpath>
    </taskdef>

    <target name="generate">
        <delete dir="./gen-src" />
        <mkdir dir="./gen-src" />

        <xjc destdir="./gen-src" language="XMLSCHEMA" package="com.mmm" >
            <schema dir="./xsd" includes="EPC*.xsd" />
        </xjc>      
    </target>

    <target name="compile" depends="generate" >
        <delete dir="./bin" />
        <mkdir dir="./bin" />

        <javac srcdir="./gen-src" destdir="./bin" includeantruntime="false" />
    </target>

    <target name="package" depends="compile" >
        <delete dir="./dist" />
        <mkdir dir="./dist" />
        <jar destfile="./dist/jaxb-gen.jar" basedir="./bin" />
    </target>   


</project>

Единственная проблема, с которой я столкнулся, заключалась в том, что у меня был xsd с корневым тегом <product>, который анонимно расширил тип Product для добавленияversion атрибут (который мне всегда нравится иметь в моем корневом теге), который вызывал конфликт имен для JAXB.Поэтому вместо этого я превратил анонимный тип в именованный тип (т. Е. TopLevelProduct) и установил для корня этот тип, и JAXB был доволен этим.

...