Frage

Ich versuche, meinen Kopf um XML-Schema und eine Sache, ich versuche, herauszufinden, ist zu wickeln, wie relationale Typschemen zu tun, wo auf Element zum anderem bezieht, möglicherweise zusammen in einem anderen Schema. Ich habe an der XSD sah: Schlüssel und xsd: keyref und es scheint, wie die Art der Sache interessiert mich, aber ich bin mir nicht sicher. Zunächst Ich habe nur Attribute mit dem Typ xs: ID abd xs:. IDREF, was natürlich nicht unbedingt so weit auf ein bestimmtes Element beziehen, wie ich sagen könnte,

Grundsätzlich habe ich mehrere verschiedene XML-Dateien, in denen Elemente mit anderen Elementen entweder in der gleichen Datei oder andere Dateien verweisen. Es sieht viel wie eine relationale Datenbank und ich würde gerne ein verwenden, aber die Voraussetzung ist nur XML-Dateien zu verwenden und so bin ich zumindest versuchen zu etablieren einige Vernunft statt nur scheinbar zufälligen Zeichenfolgen die sich auf xML-Kommentare, die die Beziehungen zu definieren. Es funktioniert für kleinere Projekte, aber es ist sicherlich nicht skalierbar.

Alle Gedanken?

War es hilfreich?

Lösung

Ich bin mir nicht bewusst etwas in XML-Schema, das Sie mehrere XML-Dokumente gegeneinander validieren können. Im xs:id und xs:key (etc) Einschränkungen verwenden Sie XPath die Einschränkungen gelten. Sie können XML Schema Part 1: Structures und nach unten scrollen ein wenig für das Beispiel dieser Einschränkungen in Aktion zu sehen.

Wenn Sie die Möglichkeit haben, eine Meta-XML-Datei zu definieren, die Ihre anderen enthält (möglicherweise durch Entitätsverweise wenn kein anderer Weg) und dann ein Schema für die Meta-Datei verwenden, dann sollten Sie in der Lage sein, die Verwendung von XML-Schema gelten Ihre Einschränkungen. Wenn Sie ein Schema für jede Ihrer XML-Dateitypen definieren, sollten Sie in der Lage seines trivialen zu (von xs:import oder xs:include) ein Meta-Schema für eine XML-Datei definieren, die alle Ihrer XML-Inhalte in einer XML-Datei enthält. Diese Meta-Schema konnte erfolgreich die Einschränkungen gelten Sie wollen.

Angenommen, Sie haben ein Wiki zu validieren, die viele Beiträge haben, wobei jeder Beitrag einen Autor hat und vielleicht viele Kommentare, wo jeder Kommentar auch einen Autor hat, und dass Sie eine XML-Datei für alle Beiträge, ein für alle Kommentare, ein für alle Autoren, und Sie wollen Einschränkungen zwischen diesen Dateien validieren, dass jeder Beitrag Autoren und Kommentare verwendet, die vorhanden ist, dass jeder Kommentar Autoren verwendet, die es gibt, und so weiter. Angenommen, Sie haben die folgenden drei Dateien haben:

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>

Was ich vorschlage, ist, dass Sie eine Meta-XML-Datei erstellen, indem Sie Entitätsverweise . Zum Beispiel könnten Sie 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 ... die „Meta“ ist nur aus der Perspektive Ihrer drei definierten XML-Dateien und nicht in jedem XML-Sinne) ist das genaue Äquivalent der folgenden Datei und XML-Parser wird tun, als ob Sie wirklich die folgende Datei hatte:

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

dieses Datei können Sie ein XML-Schema definiert werden, die die gewünschten Einschränkungen gelten, auch wenn mit den einzelnen Dateien gibt es keine Möglichkeit Einschränkungen gelten. Da die Verwendung Notation XML-Entity Sie haben „enthalten“ alle XML-Daten in einer Datei, Sie XPath in den contraint Referenzen verwenden können.

Andere Tipps

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top