Domanda

Sto cercando di avvolgere la mia testa attorno agli schemi xml e una cosa che sto cercando di capire è come fare schemi di tipo relazionale in cui su elemento si riferisce a un altro, possibilmente in un altro schema del tutto. Ho guardato xsd: key e xsd: keyref e sembra il tipo di cosa che mi interessa, ma non ne sono sicuro. Inizialmente ho appena impostato gli attributi con il tipo xs: ID abd xs: IDREF, che ovviamente non si riferisce necessariamente a un elemento specifico per quanto potrei dire.

Fondamentalmente, ho diversi file xml diversi in cui gli elementi si riferiscono ad altri elementi nello stesso file o in altri file. Assomiglia molto a un database di relazioni e mi piacerebbe usarne uno, ma il requisito è quello di utilizzare solo file XML e quindi almeno sto cercando di stabilire alcuni sanità mentale anziché solo stringhe apparentemente casuali basandosi su commenti XML per definire le relazioni. Funziona con progetti più piccoli, ma non è certamente scalabile.

Qualche idea?

È stato utile?

Soluzione

Non sono a conoscenza di nulla all'interno dello schema XML che ti consentirà di convalidare più documenti XML l'uno contro l'altro. Nei vincoli xs: id e xs: key (etc), si utilizza xpath per applicare i vincoli. Puoi andare a XML Schema Part 1: Structures e scorrere verso il basso un po 'per l'esempio per vedere questi vincoli in azione.

Se hai la possibilità di definire un file meta-XML che include gli altri (forse per riferimenti di entità se non in altro modo) e quindi utilizzare uno schema per quel meta file, allora dovresti essere in grado di utilizzare lo schema XML per applica i tuoi vincoli. Se definisci uno schema per ciascuno dei tuoi tipi di file XML, dovresti essere in grado banalmente (con xs: import o xs: include ) di definire un meta-schema per un File XML che include tutto il contenuto XML in un unico file XML. Questo meta-schema potrebbe applicare correttamente i vincoli desiderati.

Supponiamo che tu debba convalidare un Wiki che ha molti post, in cui ogni post ha un autore e forse molti commenti in cui ogni commento ha anche un autore e che hai un file XML per tutti i post, uno per tutti i commenti, uno per tutti gli autori e si desidera convalidare i vincoli tra questi file, che ogni post utilizza autori e commenti esistenti, che ogni commento utilizza autori esistenti e così via. Supponiamo che tu abbia i seguenti tre file:

Il file /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>

Il file /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>

Il file /home/username/authors.xml :

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

Quello che sto suggerendo è di creare un file meta-XML utilizzando Riferimenti entità . Ad esempio, è possibile creare il seguente file 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>

Questo file meta-XML (in realtà, un semplice vecchio file XML ... il "meta" è solo dal punto di vista dei tre file XML definiti e non in alcun senso XML) è l'equivalente esatto del seguente file e i parser XML funzioneranno come se avessi davvero il seguente file:

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

Da questo è possibile definire uno schema XML che applicherà i vincoli desiderati, anche se con i singoli file non è possibile applicare vincoli. Da quando usi la notazione di entità XML hai " incluso " tutto l'XML in un unico file, è possibile utilizzare xpath nei riferimenti di contrapposizione.

Altri suggerimenti

Se ricordo bene, xs: ID deve essere univoco a livello globale nell'intero documento, mentre xs: key deve essere unico per l'elemento per il quale era definito. Quindi il key / keyref è in realtà più simile a PK / FK. PK deve essere unico all'interno di una tabella.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top