XML-Schema: Kann ich einige der Attributwerte erforderlich machen, aber andere Werte zulassen?

8

(Hinweis: Ich kann die Struktur der XML, die ich erhalte, nicht ändern. Ich kann nur ändern, wie ich sie validiere.)

Sagen wir, ich kann XML so erhalten:

%Vor%

Ich muss ein XSD-Schema erstellen, das bestätigt, dass "Street", "State" und "Zip" müssen vorhanden sein müssen. Aber es ist mir egal, ob auch "StreetPartTwo" und / oder "SomeOtherCrazyValue" vorhanden sind.

Wenn ich wüsste, dass nur die drei Dinge, die mir wichtig sind, enthalten sein könnten (und dass jedes nur einmal enthalten wäre), könnte ich etwas tun:

%Vor%

Aber das funktioniert nicht mit meinem Fall, weil ich auch diese anderen Adresselemente (die auch "Feld" -Attribute haben), die mir egal sind, erhalten kann.

Irgendwelche Ideen, wie ich sicherstellen kann, dass die Dinge, die mir wichtig sind, vorhanden sind, aber lass die anderen auch rein?

TIA! Sean

    
scrotty 05.05.2010, 23:00
quelle

2 Antworten

6

Sie können die gewünschte Validierung nicht mit nur XML-Schema durchführen.

Gemäß der Spezifikation "XML-Schema Teil 1: Strukturen" ...

>
  

Wenn zwei oder mehr Partikel direkt oder indirekt in {particles} einer Modellgruppe enthalten sind, haben sie gleichnamige Elementdeklarationen   Als ihre Terminologie müssen die Typdefinitionen dieser Deklarationen die sein   gleich.

Es heißt nicht, dass Sie kein Schema erstellen können, das ein korrektes Dokument validiert. Was es bedeutet, dass Sie kein Schema erstellen können, das bei einigen falschen Dokumenten nicht überprüft werden kann. Und wenn ich "inkorrekt" sage, meine ich Dokumente, die gegen die Einschränkungen verstoßen, die Sie auf Englisch angegeben haben.

Angenommen, Sie haben ein Dokument, das drei Street-Elemente enthält:

%Vor%

Gemäß Ihrem Schema ist dieses Dokument eine gültige Adresse. Es ist möglich, Ihrem Schema eine Einschränkung xs: unique hinzuzufügen, damit solche fehlerhaften Dokumente zurückgewiesen werden . Aber selbst mit einem xs: unique würde die Validierung gegen ein solches Schema die Gültigkeit einiger anderer fehlerhafter Dokumente erklären - zum Beispiel ein Dokument mit drei <Address> -Elementen, von denen jedes ein eindeutiges Field -Attribut hat, aber keines davon hat %Code%.

Tatsächlich ist es nicht möglich, ein W3C-XML-Schema zu erstellen, das Ihre angegebenen Einschränkungen formal kodifiziert. Das Field="Zip" -Element fast bringt Ihnen Threere, aber es gilt nur zu Elementen, nicht zu Attributen. Und es kann nicht mit einer Erweiterung verwendet werden, also können Sie im W3C XML-Schema nicht "alle diese Elemente in beliebiger Reihenfolge und alle anderen" sagen.

Um die von Ihnen gewünschte Validierung durchzuführen, haben Sie folgende Optionen:

  1. verlässt sich auf etwas anderes als XML Schema,
  2. Führen Sie die Validierung in mehreren Schritten aus, wobei Sie für den ersten Schritt XML-Schema und für den zweiten Schritt noch etwas anderes verwenden.

Für die erste Option denke ich, dass Sie Relax NG dazu verwenden könnten. Der Nachteil ist, dass es kein Standard ist und soweit ich es beurteilen kann, wird es weder allgemein unterstützt noch wächst es. Es wäre, als würde man Gälisch lernen, um einen Gedanken auszudrücken. Es ist nichts falsch mit Gälisch, aber es ist eine Art sprachliche Sackgasse, und Ich denke RelaxNG ist auch .

Bei der zweiten Option wäre ein Ansatz, zuerst als erstes und dann als zweiter Schritt für Ihr Schema zu validieren:

A. Wenden Sie eine XSL-Transformation an, die <xs:all> -Elemente in Elemente konvertiert, die nach dem Wert ihres Feldattributs benannt sind. Die Ausgabe dieser Transformation würde folgendermaßen aussehen:

%Vor%

B. validiere die Ausgabe dieser Transformation gegen ein anderes Schema, das ungefähr so ​​aussieht:

%Vor%

Sie müssten dieses Schema erweitern, um andere Elemente wie <Address> in der Ausgabe der Transformation zu behandeln. Oder Sie könnten die XSL-Transformation so strukturieren, dass keine Elemente ausgegeben werden, die nicht {State, Street, Zip} sind.

Nur um klar zu sein, ich verstehe, dass Sie die XML, die Sie erhalten, nicht ändern können. Dieser Ansatz würde dies nicht erfordern. Es verwendet nur einen funkigen 2-Stufen-Validierungsansatz. Sobald der zweite Validierungsschritt abgeschlossen ist, können Sie das Ergebnis der Transformation verwerfen.

BEARBEITEN - Eigentlich kann Sean, wenn er nochmal darüber nachdenkt, einfach Schritt B verwenden. Angenommen, Ihre XSL-Transformation entfernt nur aus dem Dokument <SomeOtherCrazyValue> -Elemente Für den Attributwert "Feld" ist kein Status, keine Straße oder Postleitzahl verfügbar. Mit anderen Worten, es gäbe kein <Address> . Das Ergebnis dieser Transformation könnte mit Ihrem Schema validiert werden, indem ein maxOccurs="3", minOccurs="3" und ein xs: unique verwendet werden.

    
Cheeso 06.05.2010, 02:59
quelle
0

Ich habe das gleiche Problem wie du, aber mit einem Trick überwunden.

XML anfordern

%Vor%

Benutze nun ein xslt und konvertiere es,

XSLT-Code

%Vor%

Das XML wird

%Vor%

Wenden Sie jetzt XSD an

%Vor%     
Abhishek Mukherjee 10.06.2015 13:32
quelle

Tags und Links