Скомпилируйте несколько XSD, содержащих повторяющиеся определения одного и того же элемента, с помощью JAXB - PullRequest
8 голосов
/ 13 марта 2012

Вопрос: Как я могу заставить xjc / Jaxb генерировать пропускающие javaclasses для нескольких схем, содержащих повторяющиеся определения элементов в одном и том же пространстве имен?

Информация: У меня есть три схемы .xsd: A, B и C. Все они имеют одинаковое целевое пространство имен. Это все три шамы, которые мне были даны, и я никоим образом не могу их менять.

У них A есть некоторые элементы, которые также есть в B или C (но у A также есть много самопровозглашенных элементов) Пример: это один и тот же «код» для A и C:

<xs:simpleType name="y_ym_ymdDatoType">
    <xs:union memberTypes="arcgYearType arcgYearMonthType arcDateType"/>
</xs:simpleType>
<xs:simpleType name="arcgYearType">
    <xs:restriction base="xs:gYear">
        <xs:minInclusive value="1700"/>
        <xs:maxInclusive value="2100"/>
    </xs:restriction>
</xs:simpleType>
<xs:simpleType name="arcgYearMonthType">
    <xs:restriction base="xs:gYearMonth">
        <xs:minInclusive value="1700-01"/>
        <xs:maxInclusive value="2100-12"/>
    </xs:restriction>
</xs:simpleType>
<xs:simpleType name="arcDateType">
    <xs:restriction base="xs:date">
        <xs:minInclusive value="1700-01-01"/>
        <xs:maxInclusive value="2100-12-31"/>
    </xs:restriction>
</xs:simpleType>

При использовании xjc для компиляции их в javaclasses я получаю следующее исключение:

[ERROR] 'y_ym_ymdDatoType' is already defined
 line 297 of file:../c.xsd

[ERROR] (related to above error) the first definition appears here
 line 309 of file:../a.xsd

и то же самое происходит с другими элементами: arcgYearType, arcgYearMonthType и arcDateType.

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

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

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

Самый простой выход - это «скомпилировать» каждый файл независимо и предоставить разные пакеты Java для каждого из файлов XSD.,Проблема здесь заключается в том, что если вы попытаетесь «связать» вместе контент из одного XML в другой (то есть unmarshall из A и затем marshall в B), то класс C1 в пакете com.A и класс C1 в пакете com.B, в то время каксоответствующие одному и тому же сложному типу XSD, не являются «взаимозаменяемыми»;вам придется развивать конверсию между ними.Вам нужен пользовательский файл привязки или, если вы используете NetBeans, просто установите разные пакеты в мастере JAXB.

Наилучшим способом может быть использование эпизодов (см. в SO ).Обработайте A.xsd, затем используйте этот эпизод для обработки B.xsd и т. Д.

0 голосов
/ 13 марта 2012

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

<bindings schemaLocation="../party.xsd" version="1.0" node="/xs:schema">
    <bindings node="//xs:complexType[@name='FixedIncomeBook']">
        <class name="PartyFixedIncomeBook"/>
    </bindings>
</bindings>
...