Подтвердить что ты не робот

XML Schema key/keyref - как их использовать?

Короче говоря: я хотел бы знать, как использовать key/keyref из XSD, чтобы элементы имели ссылки друг на друга. он должен иметь форму примера, используя простой xsd и XML.

Длинная история: Я знаком с использованием ID/IDREF. Я использую их для подключения элементов для JAXB. Мне неоднократно говорили, что конструкция key/keyref в XSD обеспечивает повышенную гибкость для межэлементной ссылки. Я консультировался с книгой OReilly XML Schema, которая, кажется, учит всему правильному определению key/keyref и тому, как она похожа на ID/IDREF (но лучше) и не дает простого примера его использования. Это похоже не так, потому что вы определяете ID как атрибут в одном элементе и IDREF в другом элементе и voila. Но key/keyref должны быть определены в общем предке ссылки и ссылочного элемента (AFAIK)...

Я использую файлы XSD для создания JAXB-связанных классов Java с помощью XJC

Я искал инструкции, учебные пособия и примеры, но google дает мне обрывки. то же самое для поисков на SO (также с google и включенным поиском с "+" ).

Чтобы упростить жизнь, я подготовил XSD с уже определенной парой key/keyref, как я ее понял.

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="referenced">
                <xs:complexType>
                    <xs:attribute name="id" type="xs:string" />
                </xs:complexType>
            </xs:element>
            <xs:element name="owner">
                <xs:complexType>
                    <xs:attribute name="id" type="xs:string" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:key name="aKey">
        <xs:selector xpath="owner" />
        <xs:field xpath="@id" />
    </xs:key>
    <xs:keyref name="aKeyRef" refer="aKey">
        <xs:selector xpath="referenced" />
        <xs:field xpath="@id" />
    </xs:keyref>
</xs:element>

Как бы выглядел фрагмент XML с элементом-владельцем, ссылающимся на "ссылочный" элемент?

EDIT: применил изменение, предложенное Tom W, изменив атрибут xpath ключевого элемента на "owner". JAXB (XJC) все равно не заботится, хотя.

Спасибо

4b9b3361

Ответ 1

В документе экземпляра нет специального синтаксиса. Просто требуется, чтобы keyref node соответствовал существующему ключу node. Проверка проверяет, выполнено ли ограничение ключа.

Введите код:

Я только начал заниматься с ключами самостоятельно, но я думаю, что я заметил ошибку в твоем - aKey должен выглядеть так:

<xs:key name="aKey">
    <xs:selector xpath="owner" />
    <xs:field xpath="@id" />
</xs:key>

Кроме того - это ограничение с ключом не распознает пространство имен по умолчанию. Вы всегда должны префикс каждой части selector xpath с префиксом пространства имен элемента, который вы ищете. Если у вас нет префикса пространства имен - жестко, вам нужно добавить его. Это ограничение стандарта.

Ответ 2

Спецификация JAXB явно не охватывает key/keyref. Однако возможности JAXB, такие как EclipseLink MOXy (я технический лидер) имеют расширения для этого. Наш предстоящий выпуск 2.2 предоставляет средства для определения такого рода отношений посредством аннотаций (я приведу пример). Ниже приведена ссылка на то, как это можно сделать с помощью текущей версии.

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

UPDATE

Я надеялся привести пример с ответом, но у меня заканчивается время, прежде чем я уйду в отпуск. Ниже приведен пример из наших проектных документов, который демонстрирует концепцию:

Ответ 3

Я нашел эту нить, ища ту же самую вещь, которую искал OP, - простой пример использования элемента <xs:key>. Все вещи JAXB были греческими для меня и отвлекающими. Для других, нашедших эту тему позже, вот простой пример, опубликованный на MSDN через пару лет после того, как ОП задал вопрос здесь на SO:

https://msdn.microsoft.com/en-us/library/ms256101%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

В случае изменения ссылки MSDN путь прохождения паттерна:

https://msdn.microsoft.com/library, затем нажмите "Переключиться на просмотр TOC библиотеки", и развернитесь через:

Библиотека MSDN > .NET-разработкa > .NET Framework 4.6 и 4.5 > Руководство по разработке > Данные и моделирование > Справочник по XML-стандартам > Справочник XML-схем (XSD) > Элементы схемы XML > < xsd: key > Элемент

Ответ 4

JAXB не поддерживает ссылки с помощью xs:key или xs:keyref. В спецификации указано, что эти ограничения могут быть проверены во время проверки, но они не влияют на данные.

Однако вы можете достичь этого (более или менее) с помощью xs:ID и xs:IDREF. Для введения см. Главы 2.2.15 Обращение к другому элементу XML и 4.3 Сборка данных со ссылками (ID, IDREF) в J AXB Tutorial от Wolfgang Laun.

Для вашего образца 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>

Ответ 5

Пожалуйста, попробуйте увидеть ключ /keyref учебник.

Цветной текст очень полезен.