JAXB не поддерживает ссылки с помощью xs:key
или xs:keyref
. В спецификации говорится, что эти ограничения могут быть проверены во время проверки, но они не влияют на данные.
Однако вы можете достичь этого (более или менее), используя xs:ID
и xs:IDREF
. Введение см. В главах 2.2.15. Обращение к другому элементу XML и 4.3. Сборка данных со ссылками (ID, IDREF) в руководстве по JX1011 * AXB by Вольфганг Лаун.
Для вашего образца XSD это означало бы изменение определения элемента на
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="referenced">
<xs:complexType>
<xs:attribute name="id" type="xs:ID" />
</xs:complexType>
</xs:element>
<xs:element name="owner">
<xs:complexType>
<xs:attribute name="id" type="xs:IDREF" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Обратите внимание, что идентификаторы с типом xs:ID
должны быть глобально уникальными в документе XML. Другими словами, вы не можете иметь один и тот же идентификатор для двух разных элементов в одном и том же XML-файле, даже если элементы имеют разные типы.
По умолчанию элемент или атрибут типа xs:IDREF
связывается с java.lang.Object
. Если вы заранее знаете, каким будет тип ссылочного объекта, вы можете настроить отображение, добавив аннотации JAXB в схему или с помощью объявления внешней привязки (например, xjc -b bindings.xjb
).
Пример использования аннотаций схемы JAXB (не тестировался):
<xs:element name="owner">
<xs:complexType>
<xs:attribute name="id" type="xs:IDREF">
<xs:annotation>
<xs:appinfo>
<jaxb:property>
<jaxb:baseType name=”SomeType”/>
</jaxb:property>
</xs:appinfo>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
Пример использования объявления внешних привязок (не проверено):
<jaxb:bindings node="//xs:element[@name=’owner’]//xs:attribute[@name='id']”>
<jaxb:property>
<jaxb:basetype name="SomeType"/>
</jaxb:property>
</jaxb:bindings>