我正试图围绕xml架构,我想弄清楚的一件事是如何做关系类型架构,其中元素引用另一个,可能在另一个架构中。我看过xsd:key和xsd:keyref,它看起来像我感兴趣的东西,但我不确定。最初我只是使用xs:ID abd xs:IDREF类型设置属性,就我所知,这显然不一定是指特定元素。

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

有什么想法吗?

有帮助吗?

解决方案

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

如果您能够定义包含其他文件的元XML文件(可能通过实体引用,如果没有其他方式),然后使用该元文件的模式,那么您应该能够使用XML Schema应用你的约束。如果为每种XML文件类型定义一个模式,您应该能够轻松地(通过 xs:import xs: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>

我建议您使用实体参考制作元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文件......“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。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top