XML Schema key/keyref - 如何使用它们?

kos*_*tja 26 xml schema xsd reference jaxb

长话短说:我想知道如何使用XSD中的key/keyref让元素互相引用.它必须有一个示例的形式,使用简单的xsd和XML.

长话:我熟悉ID/IDREF的用法.我用它来连接JAXB的元素.我一再被告知,XSD中的key/keyref构造为元素间引用提供了增强的灵活性.我已经查阅了OReilly XML Schema一书,它似乎教会了关于key/keyref的正确定义以及它与ID/IDREF(但更好)类似的一切,并没有给出一个简单的使用示例.它似乎并不相似,因为您将ID定义为一个元素中的属性,将IDREF定义为另一个元素中的ID.但是key/keyref必须在引用和引用元素(AFAIK)的共同祖先中定义...

我使用XSD文件使用XJC生成JAXB绑定的Java类

我搜索了how-to,教程和示例,但谷歌给了我一些废话.同样适用于搜索SO(也使用谷歌和包含搜索的'+').

为了让每个人的生活更轻松,我准备了一个已经定义的密钥/密钥对的XSD,正如我所理解的那样.

<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>
Run Code Online (Sandbox Code Playgroud)

一个XML如何看起来像一个'owner'元素引用'引用'元素?

编辑:应用Tom W提议的更改,将关键元素的xpath属性更改为"owner".JAXB(XJC)仍然不在乎.

谢谢

Tom*_*m W 6

实例文档中没有特殊语法.简单地要求keyref节点匹配现存的密钥节点.验证将告诉您是否满足关键约束.

你的代码:

我自己刚刚开始涉足钥匙,但我想我发现了你的错误 - aKey应该是这样的:

<xs:key name="aKey">
    <xs:selector xpath="owner" />
    <xs:field xpath="@id" />
</xs:key>
Run Code Online (Sandbox Code Playgroud)

此外 - 这是一个问题 - 关键限制无法识别默认命名空间.您必须始终在selectorxpath的每个部分前面添加您正在查找的元素的名称空间前缀.如果你没有命名空间前缀 - 很难,你需要添加一个.这是标准的限制.


bdo*_*han 5

JAXB规范没有明确涵盖key/keyref.但是,EclipseLink MOXy(我是技术主管)等JAXB实现对此有扩展.我们即将推出的2.2版本提供了一种通过注释指定这种关系的方法(我将把一个例子放在一起).以下是使用当前版本如何完成的链接.

有关更多信息,请参阅

UPDATE

我希望得到答案的一个例子,但在我休假之前,我的时间已经不多了.以下是我们的设计文档中的示例,它演示了以下概念:


小智 5

我发现此线程正在搜索OP正在搜索的相同内容-该<xs:key>元素的简单用法示例。JAXB的所有内容对我来说都是希腊语,并且使我分心。对于稍后找到该线程的其他人,这是OP在SO上在此处询问问题几年后在MSDN上发布的一个简单示例:

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

如果MSDN链接发生更改,则面包屑路径为:

https://msdn.microsoft.com/library,然后单击“切换到库目录视图”,然后向下钻取:

MSDN库> .NET开发> .NET Framework 4.6和4.5>开发指南>数据和建模> XML标准参考> XML模式(XSD)参考> XML模式元素> <xsd:key>元素