【问题标题】:Implementing foreign key type relationships in XSD schema在 XSD 模式中实现外键类型关系
【发布时间】:2010-10-11 12:16:18
【问题描述】:

我正试图围绕 xml 模式进行思考,而我试图弄清楚的一件事是如何在元素上引用另一个的关系类型模式,可能完全在另一个模式中。我查看了 xsd:key 和 xsd:keyref ,这似乎是我感兴趣的东西,但我不确定。最初我只是设置类型为 xs:ID abd xs:IDREF 的属性,据我所知,这显然不一定指特定的元素。

基本上,我有几个不同的 xml 文件,其中元素引用同一文件或其他文件中的其他元素。它看起来很像一个关系数据库,我很想使用一个,但要求是只使用 XML 文件,所以我至少试图建立 some 健全性,而不是看似随机的字符串依靠 xml cmets 来定义关系。它适用于较小的项目,但肯定无法扩展。

有什么想法吗?

【问题讨论】:

    标签: xsd foreign-keys schema database-relations


    【解决方案1】:

    我不知道 XML Schema 中有任何东西可以让您相互验证多个 XML 文档。在 xs:idxs:key (etc) 约束中,您使用 xpath 来应用约束。您可以转到 XML Schema Part 1: Structures 并向下滚动一点以查看示例以查看这些约束的实际作用。

    如果您有能力定义一个包含您的其他文件的元 XML 文件(如果没有其他方式,可能通过实体引用)然后使用该元文件的架构,那么您应该能够使用 XML 架构来应用你的约束。如果您为每种 XML 文件类型定义一个模式,您应该能够轻松地(通过xs:importxs:include)为一个 XML 文件定义一个元模式,该 XML 文件在一个 XML 文件中包含您的所有 XML 内容。此元模式可以成功应用您想要的约束。

    假设您必须验证一个包含许多帖子的 Wiki,其中每个帖子都有一个作者,可能还有许多 cmets,其中每个评论也有一个作者,并且您有一个用于所有帖子的 XML 文件,一个用于所有 cmets,一个适用于所有作者,并且您想要验证这些文件之间的约束,每个帖子使用存在的作者和 cmets,每个评论使用存在的作者,等等。假设您有以下三个文件:

    文件/home/username/posts.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <posts>
      <post>
        <author name="author1"/>
        <comment id="12345" pos="1"/>
        <comment id="12346" pos="2"/>
        <body>I really like my camera...</body>
      </post>
       ...
    </posts>
    

    文件/home/username/comments.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <comments>
      <comment id="12345" author="kindguy">
        That was a very good post
      </comment>
       ...
    </comments>
    

    文件/home/username/authors.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <authors>
      <author name="kindguy" id="1"/>
      <author name="author1" id="2"/>
       ...
    </authors>
    

    我的建议是使用Entity References 创建一个元 XML 文件。例如,您可以创建以下 XML 文件:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!ENTITY postfile    SYSTEM "file:///home/username/posts.xml">
    <!ENTITY commentfile SYSTEM "file:///home/username/comments.xml">
    <!ENTITY authorfile  SYSTEM "file:///home/username/authors.xml">
    <root>
      &postfile1;
      &commentfile;
      &authorfile;
    </root>
    

    这个元 XML 文件(实际上,一个普通的旧 XML 文件......“元”只是从您定义的三个 XML 文件的角度来看,而不是任何 XML 意义上的)与以下文件完全等效,并且 XML 解析器将像您真正拥有以下文件一样工作:

    <?xml version="1.0" encoding="UTF-8" ?>
    <root>
      <posts>
        <post>
          <author name="author1"/>
          <comment id="12345" pos="1"/>
          <comment id="12346" pos="2"/>
          <body>I really like my camera...</body>
        </post>
         ...
      </posts>
      <comments>
        <comment id="12345" author="kindguy">
          That was a very good post
        </comment>
         ...
      </comments>
      <authors>
        <author name="kindguy" id="1"/>
        <author name="author1" id="2"/>
         ...
      </authors>
    </root>
    

    this 文件中,您可以定义一个 XML 模式来应用所需的约束,即使对于单个文件没有办法应用约束。由于使用 XML 实体表示法,您已将所有 XML “包含”到一个文件中,因此您可以在约束引用中使用 xpath。

    【讨论】:

    • 不幸的是,需要使用多个 xml 文档。有一个发布系统可以覆盖任何本地更改。没有办法合并,因此有必要尽量减少将数据分解为多个文档所造成的损害。这很不幸,但现实 =/ 谢谢!
    • 但是出于验证目的,您不能创建一个 additional XML 文件,该文件使用实体引用来包含您无法修改的规范 XML 文件吗?您可以在这个“临时”XML 文件中应用约束,该文件只包含其他 XML 文件。
    • 我想我理解你在抽象意义上的意思,但我认为我需要一个具体的例子来完全理解它。您链接的网站会解释这种关系吗?
    • 我将在今天晚些时候编辑我的帖子以添加一个小示例。遗憾的是,XML 模式标准不会解释这一点。
    • 谢谢埃迪,我真的很感激!很棒的迷你教程!
    【解决方案2】:

    http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html 请注意第 3.11 节中讨论了此问题。

    【讨论】:

      【解决方案3】:

      如果我没记错的话,xs:ID 在整个文档中必须是全局唯一的,而xs:key 只需对于定义它的元素是唯一的。所以key/keyref 实际上更像PK/FK。 PK 只需在一张表中唯一。

      【讨论】:

      • 嗯,这听起来像是我想要的。是否可以创建多个模式来共同验证多个 xml 文件作为一个整体。即,如果我在一个文档中有许多具有键的元素,我可以从另一个文档中引用它们并仍然对其进行验证吗?
      • 我认为这回答了您的问题:“refer=QName; 必需。指定此或其他架构中定义的键或唯一元素的名称”。
      猜你喜欢
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 2013-05-27
      • 1970-01-01
      • 2023-01-26
      相关资源
      最近更新 更多