代码之家  ›  专栏  ›  技术社区  ›  Marcus Stade Quentin

在XSD模式中实现外键类型关系

  •  3
  • Marcus Stade Quentin  · 技术社区  · 15 年前

    我试着将我的头放在XML模式上,我想知道的一件事是如何做关系型模式,其中on元素引用另一个模式,可能是在另一个模式中。我看过xsd:key和xsd:keyref,这似乎是我感兴趣的,但我不确定。最初,我只是使用xs:id-abd-xs:idref类型设置属性,显然,据我所知,它不一定引用特定的元素。

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

    有什么想法吗?

    3 回复  |  直到 10 年前
        1
  •  5
  •   Eddie    15 年前

    我不知道XML模式中允许您相互验证多个XML文档的任何内容。在 xs:id xs:key (etc)约束,使用xpath来应用约束。你可以去 XML Schema Part 1: Structures 并向下滚动一点以查看示例中的这些约束。

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

    假设您必须验证一个wiki,该wiki有多个帖子,其中每个帖子都有一个作者,可能有多个评论,其中每个评论也有一个作者,并且您有一个XML文件用于所有帖子,一个用于所有评论,一个用于所有作者,并且您希望验证这些文件之间的约束,每个帖子使用现有的作者和评论t,每条评论都使用存在的作者,等等。假设您有以下三个文件:

    文件 /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 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文件…“meta”仅从您定义的三个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>
    

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

        2
  •  1
  •   Devin Burke Robert Isaev    12 年前
        3
  •  0
  •   vartec    15 年前

    如果我记错了, xs:ID 必须在整个文档中具有全局唯一性,而 xs:key 只需对其定义的元素是唯一的。所以 key/keyref 实际上更像pk/fk。pk只能在一个表中唯一。