Frage

Ich muß ein Schema für ein XML-Format machen, der bereits verwendet wird. Die bestehende XML wird erzeugt bereits von einem anderen Programm, und es klingt wie es schwierig sein würde, alle Orte aufzuspüren, um geändert werden müßte ein regelmäßigere XML-Format zu verwenden.

Hier ist ein Beispiel ähnlich unsere XML-Struktur:

<data>
    <summary>some info</summary>
    <error>error message (only if there was an error)</error>
    <details>more info
        <x>more</x>
        <y>even more</y>
    </details>
    <error>another error message</error>
    <z>some extra info</z>
</data>

Beachten Sie, dass der Fehler-Tag auf dem gleichen Niveau wiederverwendet wird und kommt, nachdem bestimmte Gegenstände, andere aber nicht, also kann ich nicht nur gesetzt maxOccurs = „unbounded“. Ich habe versucht, die dazugehörigen Paare von Fehler / anderen Tags in einem XSD Einwickeln. Sequenz, aber das funktioniert der Trick nicht, weil ich bin immer noch effektiv die Unique Particle Attribution Regel brechen

Kann dies auch getan werden, oder muss ich die anderen Entwickler wissen lassen, dieses Schema wird zur Validierung nicht?

War es hilfreich?

Lösung

Meine Lesart der XML-Schema Standard sagt, dass Sie wahrscheinlich sicher sind. Sie definieren einfach nicht aufeinander folgende Elemente mit dem gleichen Namen in Ihrem Schema, das XML zu reflektieren, wie es wird (oder wird) erzeugt. Solange alle „Fehler“ Instanzen sind immer durch andere Elemente getrennt und nicht aufeinander folgen, sollte dies kein Problem sein. Zum Beispiel so etwas wie:

  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="summary" minOccurs="1" maxOccurs="1" type="xs:string" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="details" minOccurs="1" maxOccurs="1" type="detailsType" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="z" minOccurs="0" maxOccurs="1" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="error" type="xs:string"/>

  <xs:complexType name="detailsType">
    ....
  </xs:complexType>

Wenn Details haben minOccurs = „0“ und die ersten „Fehler“ oben hat einen maxOccurs> 1 ist, dann versagen Sie die Unique Particle Attribution Regel, weil die Validierung nicht überprüfen kann, wenn Sie zwei Fehlerelemente in einer Reihe, welche Instanz von „Fehlern“ in dem Schema gehören sie zu. Doch solange jede Instanz von „Fehlern“ eindeutig im Schema identifiziert werden, aufgrund des guten Gebrauchs von „minOccurs“ und „maxOccurs“ für die Fehlerelemente und für Elemente dazwischen, dann sind Sie gut.

Sie können sogar aufeinander folgende Instanzen von „Fehlern“ haben, solange das Validator-Schema immer eindeutig herausfinden kann, welche Instanz bezeichnet wird von minOccurs und maxOccurs (zum Beispiel) verwendet wird.

Denken Sie über xhtml, in der die Elemente in beliebiger Reihenfolge, mit beliebiger Wiederholung auftreten können.

EDIT: Aktualisiert Änderungen in ursprünglichen Frage zu reflektieren

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