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.

War es hilfreich?

Lösung

kurz

  1. Dokument ist gültig, da Elemente minOccurs="0" haben.
  2. 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 mit und minOccurs zu 1 auf den Subelementen Wechsel funktioniert, wenn Sie interessiert nicht, was die Elemente bestellen erscheinen in und es sieht aus wie Sie dies nicht tun. Wenn Sie minOccurs zu 1 auf den Kindern dann eine gültige Wahl wäre immer noch nicht festgelegt sei das Element auftritt 0 Mal und Ihre XML würde validieren. Wenn Sie minOccurs bis 2 auf die untergeordneten Elemente festgelegt dann würden Sie mindestens 4 Elemente, da Sie eine Auswahl zweimal machen würde und von jedem Kind-Element holen auftretenden zweimal jeweils.

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