3 Stimmen

Implementierung von Beziehungen des Typs Fremdschlüssel im XSD-Schema

Ich versuche, mich in Xml-Schemata einzuarbeiten, und eine Sache, die ich herauszufinden versuche, ist, wie man relationale Schemata erstellt, in denen ein Element auf ein anderes verweist, möglicherweise in einem ganz anderen Schema. Ich habe mir xsd:key und xsd:keyref angeschaut, und es scheint die Art von Sache zu sein, die mich interessiert, aber ich bin mir nicht sicher. Ursprünglich habe ich nur Attribute mit dem Typ xs:ID und xs:IDREF gesetzt, die sich offensichtlich nicht unbedingt auf ein bestimmtes Element beziehen, soweit ich das beurteilen kann.

Grundsätzlich habe ich mehrere verschiedene Xml-Dateien, in denen Elemente auf andere Elemente entweder in derselben Datei oder in anderen Dateien verweisen. Es sieht sehr nach einer Beziehungsdatenbank aus, und ich würde gerne eine verwenden, aber die Anforderung ist, nur XML-Dateien zu verwenden, und so versuche ich zumindest, Folgendes zu etablieren einige Vernunft statt nur scheinbar zufälliger Zeichenfolgen, die sich auf XML-Kommentare zur Definition der Beziehungen verlassen. Für kleinere Projekte funktioniert das, aber es ist sicherlich nicht skalierbar.

Haben Sie eine Idee?

5voto

Eddie Punkte 52504

Mir ist nicht bekannt, dass es in XML-Schema irgendetwas gibt, mit dem Sie mehrere XML-Dokumente gegeneinander validieren können. In der xs:id y xs:key (usw.), verwenden Sie xpath, um die Beschränkungen anzuwenden. Sie können zu XML-Schema Teil 1: Strukturen und scrollen Sie ein wenig nach unten, um das Beispiel zu sehen, das diese Einschränkungen in Aktion zeigt.

Wenn Sie die Möglichkeit haben, eine Meta-XML-Datei zu definieren, die Ihre anderen Dateien enthält (vielleicht durch Entitätsreferenzen, wenn nicht auf andere Weise), und dann ein Schema für diese Meta-Datei zu verwenden, dann sollten Sie in der Lage sein, XML-Schema zu verwenden, um Ihre Beschränkungen anzuwenden. Wenn Sie für jeden Ihrer XML-Dateitypen ein Schema definieren, sollten Sie in der Lage sein, trivial (durch xs:import o xs:include ) ein Meta-Schema für eine XML-Datei definieren, das Ihren gesamten XML-Inhalt in einer XML-Datei enthält. Dieses Meta-Schema könnte die von Ihnen gewünschten Einschränkungen erfolgreich anwenden.

Nehmen wir an, Sie müssen ein Wiki mit vielen Beiträgen validieren, bei dem jeder Beitrag einen Autor und vielleicht viele Kommentare hat, bei denen jeder Kommentar auch einen Autor hat, und Sie haben eine XML-Datei für alle Beiträge, eine für alle Kommentare, eine für alle Autoren, und Sie wollen Einschränkungen zwischen diesen Dateien validieren, dass jeder Beitrag Autoren und Kommentare verwendet, die es gibt, dass jeder Kommentar Autoren verwendet, die es gibt, und so weiter. Nehmen wir an, Sie haben die folgenden drei Dateien:

Die Datei /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>

Die Datei /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>

Die Datei /home/username/authors.xml :

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

Ich schlage vor, dass Sie eine Meta-XML-Datei erstellen, indem Sie Entität Referenzen . Sie könnten zum Beispiel die folgende XML-Datei erstellen:

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

Diese Meta-XML-Datei (eigentlich eine einfache alte XML-Datei ... das "Meta" ist nur aus der Perspektive Ihrer drei definierten XML-Dateien und nicht im Sinne von XML) ist das exakte Äquivalent der folgenden Datei, und XML-Parser verhalten sich so, als hätten Sie wirklich die folgende Datei:

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

Desde este Datei können Sie ein XML-Schema definieren, das die gewünschten Beschränkungen anwendet, obwohl es bei den einzelnen Dateien keine Möglichkeit gibt, Beschränkungen anzuwenden. Da Sie mit der XML-Entity-Notation das gesamte XML in eine Datei "eingeschlossen" haben, können Sie xpath in den Constraint-Referenzen verwenden.

0 Stimmen

Leider ist die Verwendung mehrerer XML-Dokumente eine Voraussetzung. Es gibt ein Veröffentlichungssystem, das alle lokalen Änderungen überschreibt. Es gibt keine Möglichkeit der Zusammenführung, und daher muss der Schaden durch Aufteilung der Daten auf mehrere Dokumente minimiert werden. Das ist bedauerlich, aber Realität =/ Danke!

0 Stimmen

Aber können Sie zu Validierungszwecken nicht eine zusätzlich XML-Datei, die Entitätsreferenzen verwendet, um die kanonischen XML-Dateien einzuschließen, die Sie nicht ändern können? Sie könnten die Beschränkungen in dieser "temporären" XML-Datei anwenden, die nichts anderes tut, als die anderen XML-Dateien einzuschließen.

1 Stimmen

Ich glaube, ich verstehe, was Sie in einem abstrakten Sinne meinen, aber ich glaube, ich bräuchte ein konkretes Beispiel, um es ganz zu begreifen. Wird die von Ihnen verlinkte Website diese Art von Beziehung erklären?

1voto

Tony Wallace Punkte 11

Diese Frage wird erörtert in http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html Anmerkung zu Abschnitt 3.11.

0voto

vartec Punkte 124396

Wenn ich mich richtig erinnere, xs:ID muss im gesamten Dokument eindeutig sein, während xs:key muss nur für das Element, für das es definiert wurde, eindeutig sein. Daher ist die key/keyref ist eigentlich mehr wie PK/FK. PK müssen nur innerhalb einer Tabelle eindeutig sein.

0 Stimmen

Nun, das klingt nach dem, was ich dann will. Ist es möglich, mehrere Schemata zu erstellen, die zusammenarbeiten, um mehrere Xml-Dateien als Ganzes zu validieren. D.h., wenn ich eine Reihe von Elementen in einem Dokument habe, die Schlüssel haben, kann ich sie aus einem anderen Dokument referenzieren und sie trotzdem validieren lassen?

0 Stimmen

Ich denke, das beantwortet Ihre Frage: "refer=QName; Erforderlich. Gibt den Namen eines Schlüssels oder eindeutigen Elements an, der in diesem oder ein anderes Schema ".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X