Xml-schema - definieren Sie die untergeordneten Elemente 0-* in beliebiger Reihenfolge
Möchte ich definieren in einem xml-schema, bei dem das element-Stecker 0-* Kind-Elemente. Entweder Sequenz, einen Verband oder eine Nachricht in beliebiger Reihenfolge und 0 zu viele Male. I. e.
<Connectors>
<Sequence />
<Association />
<Message />
<Sequence />
<Sequence />
<Message />
<Message />
<Association />
</Connectors>
Ich versucht zu definieren, das folgende schema, aber es scheint, wie die Reihenfolge ist fest.
<xs:element name="Connectors">
<xs:complexType>
<xs:sequence>
<xs:element ref="Association" minOccurs="0" maxOccurs="unbounded" />
<xs:element ref="Message" minOccurs="0" maxOccurs="unbounded" />
<xs:element ref="Sequence" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich löste es, indem Sie zu Wahl und Einstellung minOccurs-und maxOccurs-Attribute.
@Torbjörn eigene Antwort ist klarer als dies, aber nur eine kleine änderung in Ihre ursprünglich versucht hätte zu dem gleichen Ergebnis: hinzufügen
maxOccurs="unbounded"
auf die<xs:sequence>
element.Zufälliger Reihenfolge ist gesichert, da jedes element hat
minOccurs="0"
und die Sequenz kann sich wiederholen, immer und immer wieder.(Das ist nicht genau eine Antwort auf OP, aber eine Antwort auf eine andere vorgeschlagene Antwort zu OP ' s Frage. Als ganz neues Mitglied, ich bin mir nicht sicher, ob dies bricht einige Regeln oder Konventionen, die hier auf stackoverflow.com. Sorry.)
Als user @Richard schrieb in seiner Antwort:
Ist es richtig, dass es keine tags oder Attribute, insbesondere können sich solche Strukturen jedoch in dem zitierten text ist theoretisch nicht wahr, obwohl die Lösung wird schnell groß wie die Menge der Elemente wächst. Schreiben Sie ein schema für eine solche Struktur mit mehreren Elementen, ist mühsam, fehleranfällig und schwer zu verwalten. Also auch wenn eine Lösung existiert, der praktischen Umsetzung ist es nicht möglich oder es lohnt sich.
Original-Plakate Frage hatte einen Satz von nur drei zufällig auftretende Elemente. Die richtige Lösung war einfach, weil keines der Elemente war obligatorisch. Aber auch in diesem Fall, mit einer so kleinen Menge von Elementen, zwingen jeweils eines der Elemente mindestens einmal auftaucht, ist noch relativ leicht zu implementieren. Code-Beispiel unten
Connectors
wird verwendet, wie ein container genau wie OP hatte. Separateroot
element können mehrereConnector
s nur um das testen der verschiedenen Kombinationen ein bisschen einfacher.Imitieren verschiedenen Staaten mit Gruppen-Elementen
Habe ich bearbeitet diese Antwort und aktualisiert den code. Der neue wird länger, aber es ist ein ganz klares Beispiel für die Nutzung von state-basierte schema-design. Code folgt die verschiedenen Phasen einer finite-state-Maschine, die bestätigen können, dieses problem. Alle Staaten sind vertreten, wie
<xs:group>
Elemente und jede Gruppe Verweise von anderen Gruppen, die Sie vertreten alle möglichen folgenden Zustände an. Alle<xs:group>
Elemente gehorchen denselben Regeln, die für Ihre Struktur. Die Gruppen haben eine Folge von zwei Entscheidungen. Die ersten<xs:choice>
ist eine unbegrenzte Wiederholung von bereits gesehen Elemente. Die zweite<xs:choice>
enthält Sequenzen von allen möglichen neuen Elemente folgenden ein Verweis auf eine Gruppe, ist der nächste Zustand.Komplexität des Problems
Fall von N Elementen kann überprüft werden mit einem deterministischen endlichen Automaten, die hat 2^N verschiedene Zustände (einschließlich des anfangszustands). Staaten bilden N den verschiedenen Ebenen und der Menge der Zustände auf jeder Ebene entspricht binomial-Koeffizienten, d.h. Menge von Zuständen, die auf verschiedenen Ebenen ist "n über k", wobei das "n" repräsentiert die Anzahl der verschiedenen Elemente und "k" steht für die Tiefe der Ebene. Weil das hinzufügen eines weiteren Elements verdoppelt sich die Menge der benötigten heißt es, es verdoppelt auch die Anzahl der
<xs:group>
s und somit in etwa verdoppelt, die die LOK für diese komplexe Art.Gibt es eine Verwendung für diese?
Vielleicht... oder auch nicht. Manuell schreiben und insbesondere die Aktualisierung solcher Struktur für große element-sets ist wohl nicht zumutbar. Da jedoch alle Gruppen haben ähnliche Struktur es sollte relativ einfach sein, programmatisch erzeugt entsprechende XML-Schema-code für die gesamte
complexType
Struktur. Ein Weg dies zu tun, das kommt in meinem Kopf ist eine Funktion, die zwei Listen als Parameter, sichtbare und unsichtbare Elemente und fügt dann alle Elemente gesehen zu den ersten<xs:choice>
element und für jede unsichtbaren element schafft einen übergang zu entsprechenden neuen Status und ruft sich selbst für jede neue referenzierten Zustand.Beachten Sie, dass auch wenn der code-Generierung nimmt dem Schmerz, Sie manuell den überblick über die gesamte Struktur, die auf großes element legt die code-Größe, so groß, dass die Größe ist es nicht mehr zumutbar ist. Eine Reihe von 14 Elementen erfordert 2^14 = 16383 Gruppen und in der Tiefe der Stufe 7 gibt es ein maximum von (14 über 7) = 3432 parallel-Staatliche Gruppen, jede Gruppe mit 39 Elementen (= etwas über 40 LOC). Nein, Sie wollen nicht so etwas. In solchen Fällen sollten Sie Beginn der Suche nach einem anderen geeigneten schema definition language.
Dies ist ein sehr Alter thread, aber in diesem Fall jemand helfen könnte hier ist was ich getan habe um das problem zu beheben. Verwenden Sie die xsd:all, und legen Sie die minOccurs="0" auf alle Kinder, die weggelassen werden können:
Leider gibt es keine Möglichkeit in XML-Schema zu definieren", dieser Satz von child-Elementen in jeder beliebigen Reihenfolge, aber jeder tritt mindestens einmal".
Stecken Sie mit entweder einer festgelegten Reihenfolge, oder eines Satzes (möglicherweise wiederholt).
EDIT: Nein praktische Weise manuell erzeugen jede mögliche Sequenz ist möglich und würde der Arbeit, aber die kombinatorische explosion wird schnell aus der hand.