Устранение конфликта имен во включенных XSD для компиляции JAXB

В настоящее время я пытаюсь скомпилировать с помощью JAXB (IBM build 2.1.3) пару файлов схемы в один пакет. Каждый будет компилироваться сам по себе, но при попытке скомпилировать их вместе я получаю конфликт имен элементов из-за включений. Мой вопрос; есть ли способ указать с помощью внешней привязки разрешение конфликта имен.

Примеры файлов следуют. В примере нарушающий элемент называется «Общий», который определен как в incA, так и в incB:

incA.xsd

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

incB.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/"
    xmlns:tns="http://www.example.org/" elementFormDefault="qualified">
    <complexType name="TypeB">
        <sequence>
            <element name="ElementB" type="int"></element>
        </sequence>
    </complexType>
    <!-- Conflicting element -->
    <element name="Common" type="tns:TypeB"></element>
</schema>

A.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.example.org/"
    elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:tns="http://www.example.org/">
    <include schemaLocation="incA.xsd"></include>
    <complexType name="A">
        <sequence>
            <element ref="tns:Common"></element>
        </sequence>
    </complexType>
</schema>

B.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.example.org/"
    elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:tns="http://www.example.org/">
    <include schemaLocation="incB.xsd"></include>
    <complexType name="B">
        <sequence>
            <element ref="tns:Common"></element>
        </sequence>
    </complexType>
</schema>

Ошибка компилятора, когда оба скомпилированы из одного вызова xjb:

[ERROR] 'Common' is already defined
 line 9 of file:/C:/temp/incB.xsd
[ERROR] (related to above error) the first definition appears here
 line 9 of file:/C:/temp/incA.xsd

(Для справки, это обобщение для решения проблемы с компиляцией пакета OAGIS8 SP3)


person Jason Faust    schedule 26.04.2010    source источник
comment
На самом деле это не проблема JAXB, а тот факт, что схема недействительна. JAXB предоставляет способы переименовать вещи, когда они вызывают конфликт в Java, но если базовая схема недействительна, он мало что может сделать.   -  person skaffman    schedule 27.04.2010
comment
постарайтесь, чтобы ваше targetNamespace было уникальным в каждом xsd, тогда вы сможете избежать конфликта.   -  person crowne    schedule 27.04.2010


Ответы (1)


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

person Jason Faust    schedule 05.05.2010