XMLSpy ignoriert „minOccurs“? Warum ist das XML gültig?
Frage
Bitte erleuchte mich, warum XML Spy denkt, dass dieses gültig . FYI, dies gibt eine SQL-Abfrage. Hier ist die XML :
<sideBar title="LabelSearch">
<searchLabel table="ID=*.companies">
<filter accessRight="r">
<and>
<filterElement argument="companies.Type" operator="=" value="Client"/>
</and>
</filter>
</searchLabel>
</sideBar>
Das Problem: Ich soll nur ein Filterelement im Innern des „und“ Tag in nicht erlaubt werden, setzen, aber zumindest zwei. Wenn ich nur ein Filterelement hast, soll ich es ohne den umgebenden „und“ Tag verwendet. Hier ist die XSD :
<xs:complexType name="filterGroupType">
<xs:sequence>
<xs:choice>
<xs:element name="or" type="filterGroupOrType"/>
<xs:element name="and" type="filterGroupAndType"/>
<xs:element name="filterElement" type="filterType"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="accessRight" type="accessRightSimpleType" use="required"/>
</xs:complexType>
<xs:complexType name="filterGroupAndType">
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:element name="or" type="filterGroupOrType" minOccurs="0"/>
<xs:element name="filterElement" type="filterType" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="filterGroupOrType">
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:element name="and" type="filterGroupAndType" minOccurs="0"/>
<xs:element name="filterElement" type="filterType" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="filterType">
<xs:attribute name="argument" type="xs:string" use="required"/>
<xs:attribute name="operator" type="operatorSimpleType" use="required"/>
<xs:attribute name="value" type="xs:anySimpleType"/>
<xs:attribute name="field" type="fieldTitleSimpleType"/>
</xs:complexType>
Vielen Dank im Voraus.
Lösung
kurz
- Dokument ist gültig, da Elemente
minOccurs="0"
haben. - Verwenden Sie
<xs:choice>
statt<xs:sequence>
.
Bit Eine längere Antwort.
Wie @Damien sagte, dass XML ist gültig, weil dieser Teil Ihres Schemas ermöglicht Sequenzen „leer“.
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:element name="or" type="filterGroupOrType" minOccurs="0"/>
<xs:element name="filterElement" type="filterType" minOccurs="0"/>
</xs:sequence>
Mit <xs:sequence minOccurs="2" maxOccurs="unbounded">
definieren Sie, dass „diese Sequenz mindestens zweimal erscheinen müssen“. Zur gleichen Zeit <xs:element name="or" type="filterGroupOrType" minOccurs="0"/>
Ermöglicht diese Elemente innerhalb der Sequenz fehlen. Bildlich ist es wie wenn man sagt „Sie müssen eine Mahlzeit zweimal bestellen, aber du nicht von den Mahlzeiten zu essen haben Sie bestellt haben.“
Stattdessen wenn Sie wollen immer mindestens 2 Elemente Kind haben und diese Kinder können be<filterElement>
oder <or>
Elemente in beliebiger Reihenfolge, die Sie verwenden sollten <xs:choice>
mit minOccurs="1"
<xs:choice minOccurs="2" maxOccurs="unbounded">
<xs:element name="or" type="filterGroupOrType" minOccurs="1"/>
<xs:element name="filterElement" type="filterType" minOccurs="1"/>
</xs:choice>
Der Standardwert für minOccurs
ist 1, so dass Sie es heraus lassen können und Ihren Code sauberer halten und kürzer. <xs:choice>
wählt eines seiner Kinder und Wiederholungen mindestens minOccurs
mal wählen. Wenn mindestens eine der Auswahl hat, kann minOccurs="0"
dann wird die Wahl auch zulassen „leere“ Auswahl.
Andere Tipps
Sie haben einen minOccurs = "0" auf Filterelement. So ein einzelne Filterelement kann als Filterelement 0 mal gesehen werden, von einem Filterelement gefolgt. Eine gültige Folge. Vielleicht sollten Sie vermeiden minOccurs in xs Mischen: Sequenz und xs: element in Ihrem Schema ...
Sie haben eine Sequenz, die zweimal auftreten müssen, aber Elemente in der Reihenfolge sind optional (minOccurs = „0“). Die Sequenz selbst keine XML darstellt, definiert sie nur die möglichen Elemente, die es enthalten kann und die Reihenfolge, wie sie in sein muß. Eine perfekt gültige Folge in diesem Fall leer sein kann.
Ersetzen