質問

xmlスキーマに頭を包み込もうとしていますが、1つの要素が別のスキーマを参照するリレーショナルタイプスキーマを実行する方法を考えています。私はxsd:keyとxsd:keyrefを見てきましたが、私が興味を持っているようなもののように思えますが、よくわかりません。最初は、タイプxs:ID abd xs:IDREFを使用して属性を設定するだけで、明らかに特定の要素を必ずしも参照しているわけではありません。

基本的に、要素が同じファイルまたは他のファイル内の他の要素を参照するいくつかの異なるxmlファイルがあります。関係データベースによく似ているので、使用したいと思いますが、要件はXMLファイルのみを使用することです。したがって、少なくともランダムに見える文字列ではなく、何らかの正気を確立しようとしています。 xmlコメントに依存して関係を定義します。小規模なプロジェクトでは機能しますが、確かにスケーラブルではありません。

何か考えはありますか

役に立ちましたか?

解決

XMLスキーマ内で、複数のXMLドキュメントを相互に検証できるものを認識していません。 xs:id および xs:key (など)の制約では、xpathを使用して制約を適用します。 XMLスキーマパート1:構造に移動して、下にスクロールできます。これらの制約が実際に動作することを確認するための例について少し説明します。

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

多くの投稿があり、各投稿には作者がいて、各コメントにも作者がいる多くのコメントがあり、すべての投稿に1つのXMLファイルがあり、すべてのコメントに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>

私が提案しているのは、エンティティ参照を使用してメタ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>

this ファイルから、個々のファイルには制約を適用する方法はありませんが、目的の制約を適用するXMLスキーマを定義できます。 XMLエンティティ表記を使用しているため、「含む」ことができます。すべてのXMLを1つのファイルにまとめるには、制約参照でxpathを使用できます。

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top