Компиляция XML-схемы в Java с ограничениями идентификатора key/keyref

Допустим, у меня есть следующая схема XML:

<xs:schema 
    xmlns="http://www.example.com/data"
    xmlns:data="http://www.example.com/data"
    targetNamespace="http://www.example.com/data"
    elementFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="data">
        <xs:complexType>
            <xs:all>
                <xs:element name="countries">
                    <xs:complexType>
                        <xs:choice minOccurs="0" maxOccurs="unbounded">
                            <xs:element name="country" type="country"/>
                        </xs:choice>
                    </xs:complexType>
                </xs:element>
                <xs:element name="types">
                    <xs:complexType>
                        <xs:choice minOccurs="0" maxOccurs="unbounded">
                            <xs:element name="type" type="type"/>
                        </xs:choice>
                    </xs:complexType>
                </xs:element>
                <xs:element name="products">
                    <xs:complexType>
                        <xs:choice minOccurs="0" maxOccurs="unbounded">
                            <xs:element name="product" type="product"/>
                        </xs:choice>
                    </xs:complexType>
                </xs:element>               
            </xs:all>
        </xs:complexType>  
        <xs:key name="countryNameKey">
            <xs:selector xpath=".//data:country"/>
            <xs:field xpath="@name"/>
        </xs:key>
        <xs:key name="typeNameKey">
            <xs:selector xpath=".//data:type"/>
            <xs:field xpath="@name"/>
        </xs:key>
        <xs:keyref name="countryNameRef" refer="data:countryNameKey">
            <xs:selector xpath=".//data:product"/>
            <xs:field xpath="@country"/>
        </xs:keyref>
        <xs:keyref name="typeNameRef" refer="data:typeNameKey">
            <xs:selector xpath=".//data:product"/>
            <xs:field xpath="@type"/>
        </xs:keyref>  
        <xs:unique name="uniqueProducts">
            <xs:selector xpath=".//data:product"/>
            <xs:field xpath="@country"/>
            <xs:field xpath="@type"/>
        </xs:unique>      
    </xs:element>          
    <xs:complexType name="country">            
        <xs:attribute name="name" type="xs:string" use="required"/>        
    </xs:complexType>
    <xs:complexType name="type">            
        <xs:attribute name="name" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="product">            
        <xs:attribute name="country" type="xs:string" use="required"/>
        <xs:attribute name="type" type="xs:string" use="required"/>        
    </xs:complexType>    
</xs:schema>

Извините за надуманный пример.

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

Здесь важно отметить, что я использую key и keyref для перекрестной ссылки всех продуктов на исходную страну/тип.

Итак, мой вопрос:

Можно ли скомпилировать эту схему в классы Java, которые можно будет демаршалировать с помощью Eclipse Moxy с неповрежденными перекрестными ссылками?

Я знаю, что спецификация JAXB 2.0 не поддерживает key/keyref. Я также знаю, что Moxy делает.1

Кроме того, я знаю, что Moxy не имеет подключаемого модуля Maven и, в любом случае, использует сгенерированные XJC классы и просто добавляет файл jaxb.properties, чтобы указать используемого провайдера JAXB. 2

Поэтому я подозреваю, что ответ на мой вопрос: «Нет, вы должны сами создавать классы», но я решил проверить, прежде чем потерять надежду.

Чтобы уточнить, элемент My product в настоящее время компилируется (с использованием maven-jaxb2-plugin) к

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "product")
public class Product implements Cloneable, CopyTo, Equals, HashCode, ToString {

    @XmlAttribute(name = "country", required = true)
    protected String country;
    @XmlAttribute(name = "type", required = true)
    protected String type;
//getters and setters
}

Он ссылается на объекты String, а не на объекты Country и Type.


person Boris the Spider    schedule 25.06.2013    source источник
comment
Downvoter, пожалуйста, прокомментируйте.   -  person Boris the Spider    schedule 20.12.2013


Ответы (1)


В настоящее время EclipseLink JAXB (MOXy) расширяет инструмент XJC только для добавьте файл jaxb.properties, указывающий, что MOXy является поставщиком JAXB (JSR-222). . Я ввел следующее расширение (в настоящее время незапланированное), чтобы отслеживать этот запрос:

person bdoughan    schedule 25.06.2013
comment
@BoristheSpider - Пока они, к сожалению, :(. - person bdoughan; 25.06.2013