Question

J'essaie de comprendre les schémas XML et j'essaie de comprendre comment faire des schémas de type relationnel où élément se réfère à un autre, peut-être même dans un autre schéma. J'ai consulté xsd: key et xsd: keyref et cela semble être le genre de chose qui m'intéresse, mais je ne suis pas sûr. Au départ, je viens de définir des attributs avec le type xs: ID et xs: IDREF, qui ne font évidemment pas nécessairement référence à un élément spécifique pour autant que je sache.

Fondamentalement, j’ai plusieurs fichiers XML différents où les éléments font référence à d’autres éléments, soit dans le même fichier, soit dans d’autres fichiers. Cela ressemble beaucoup à une base de données relationnelle et j'aimerais bien en utiliser une, mais l'exigence étant d'utiliser uniquement des fichiers XML, j'essaie donc au moins d'établir une certaine santé au lieu de chaînes apparemment aléatoires. s'appuyant sur des commentaires XML pour définir les relations. Cela fonctionne pour les petits projets, mais ce n’est certainement pas évolutif.

Avez-vous des idées?

Était-ce utile?

La solution

Je ne suis au courant d'aucun élément dans XML Schema qui vous permette de valider plusieurs documents XML les uns par rapport aux autres. Dans les contraintes xs: id et xs: key (etc.), vous utilisez xpath pour appliquer les contraintes. Vous pouvez aller à la schéma XML, partie 1: Structures , puis faites défiler peu pour que l'exemple voit ces contraintes en action.

Si vous avez la possibilité de définir un fichier méta-XML incluant vos autres (peut-être par référence d'entité, sinon autrement) et d'utiliser ensuite un schéma pour ce méta-fichier, vous devriez pouvoir utiliser XML Schema pour: appliquer vos contraintes. Si vous définissez un schéma pour chacun de vos types de fichiers XML, vous devriez être en mesure de définir trivialement (par xs: import ou xs: include ) un méta-schéma Fichier XML contenant tout votre contenu XML dans un seul fichier XML. Ce méta-schéma pourrait appliquer avec succès les contraintes souhaitées.

Supposons que vous deviez valider un wiki comportant de nombreux articles, chaque article ayant un auteur et peut-être de nombreux commentaires, chaque commentaire ayant également un auteur, et disposant d'un fichier XML pour tous les articles, et d'un pour tous les commentaires. un pour tous les auteurs, et vous voulez valider les contraintes entre ces fichiers, que chaque publication utilise des auteurs et des commentaires existants, que chaque commentaire utilise des auteurs existants, etc. Disons que vous avez les trois fichiers suivants:

Le fichier /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>

Le fichier /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>

Le fichier /home/username/authors.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<authors>
  <author name="kindguy" id="1"/>
  <author name="author1" id="2"/>
   ...
</authors>

Ce que je suggère, c'est de créer un fichier méta-XML en utilisant les références d'entités . Par exemple, vous pouvez créer le fichier XML suivant:

<?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>

Ce fichier méta-XML (en fait, un ancien fichier XML simple ... la "méta" ne figure que dans la perspective de vos trois fichiers XML définis, et non dans un sens XML quelconque) est l'équivalent exact de ce qui suit fichier, et les analyseurs XML agissent comme si vous aviez réellement le fichier suivant:

<?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>

À partir de ce fichier , vous pouvez définir un schéma XML qui appliquera les contraintes souhaitées, même s'il n'est pas possible d'appliquer des contraintes aux fichiers individuels. Depuis que vous utilisez la notation d'entité XML, vous avez " inclus " tout le XML en un seul fichier, vous pouvez utiliser xpath dans les références de contraint.

Autres conseils

Si je me souviens bien, xs: ID doit être globalement unique dans l'ensemble du document, tandis que xs: key ne doit être unique que pour l'élément pour lequel il était. défini. Donc, la clé / keyref ressemble en réalité davantage à PK / FK. Les PK doivent seulement être uniques dans une table.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top