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

标签 xsd foreign-keys schema database-relations

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

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

有什么想法吗?

最佳答案

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

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

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

文件/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>

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

关于xsd - 在 XSD 模式中实现外键类型关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/614700/

相关文章:

mysql - 不同教授和类(class)的 SQL 查询

java - 解码、xml 到 java、XSD 中未定义的无效枚举值被忽略

java - 用于枚举的 wsimport JAXB 类

mysql - MySQL 数据库中的多种关系

MySQL DB 忽略外键约束

java - JAXB 模式与类/包的关系

.net - 对数据契约(Contract)实现限制

java - 将xml文档导入到jaxb创建的实体结构中

mysql - 无法添加外键约束

json - 使用版本控制在项目之间共享 Json Schema 文件