3

私はxmlスキーマに頭を悩ませようとしていますが、理解しようとしているのは、要素が別の、おそらく別のスキーマ全体を参照するリレーショナル型スキーマを行う方法です。xsd:key と xsd:keyref を見てきましたが、私が興味を持っているようなもののようですが、よくわかりません。最初に、xs:ID abd xs:IDREF というタイプの属性を設定しましたが、これは明らかに特定の要素を参照しているわけではありません。

基本的に、要素が同じファイルまたは他のファイル内の他の要素を参照するいくつかの異なるxmlファイルがあります。それは関係データベースによく似ており、私はそれを使用したいと思っていますが、要件は XML ファイルのみを使用することです。関係。小規模なプロジェクトでは機能しますが、スケーラブルではありません。

何かご意見は?

4

3 に答える 3

5

複数の XML ドキュメントを相互に検証できるようにする XML スキーマについては知りません。xs:idand (etc) 制約ではxs:key、xpath を使用して制約を適用します。XML Schema Part 1: Structuresに移動し、少し下にスクロールして例を表示し、これらの制約の動作を確認できます。

他のものを含むメタ XML ファイルを定義し (他に方法がない場合はエンティティ参照によって)、そのメタ ファイルのスキーマを使用できる場合は、XML スキーマを使用して制約を適用できるはずです。 . XML ファイルの種類ごとにスキーマを定義すると、1 つの XML ファイルにすべての XML コンテンツを含む XML ファイルのメタスキーマを簡単に (xs:importまたはによって) 定義できるはずです。xs:includeこのメタスキーマは、必要な制約を正常に適用できます。

多くの投稿があり、各投稿には作成者がいて、各コメントにも作成者がいる多くのコメントがある Wiki を検証する必要があり、すべての投稿に対して 1 つの XML ファイル、すべてのコメントに対して 1 つ、すべてのコメントに対して 1 つの XML ファイルがあるとします。各投稿が存在する作成者とコメントを使用すること、各コメントが存在する作成者を使用することなど、これらのファイル間の制約を検証する必要があります。次の 3 つのファイルがあるとします。

ファイル/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 ファイルです...「メタ」は、定義された 3 つの 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 が 1 つのファイルに「含まれる」ため、制約参照で xpath を使用できます。

于 2009-03-06T02:34:56.713 に答える
1

この問題については、http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.htmlノート セクション 3.11 で説明されています。

于 2012-01-09T22:28:44.827 に答える
0

私の記憶xs:IDが正しければ、ドキュメント全体でグローバルに一意でxs:keyある必要がありますが、定義された要素に対してのみ一意である必要があります。つまり、key/keyref実際にはPK/FKに似ています。PKは、1つのテーブル内で一意である必要があります。

于 2009-03-05T13:36:49.067 に答える