Unterschied zwischen <xsd: all> und <xsd: sequence> in der Schemadefinition?


80

Ich benutze xsd:allin einem komplexen Typ. Wenn ich während der Validierung obligatorische Elemente verpasse, werden alle Elemente angezeigt. Das exakt fehlende Element wird nicht angezeigt.

Aber wenn ich gebraucht xsd:sequencewerde, kann ich das genau übersehene Element bekommen.

Gibt es einen Unterschied zwischen diesen beiden?

xsd:sequence: XML-Element muss in derselben Reihenfolge sein.

Aber xsd:all: XML-Element kann eine beliebige Reihenfolge sein.


Grundsätzlich ist der Unterschied zwischen diesen beiden, was Sie bereits in Ihrer Frage angegeben haben. Die mit der Verwendung dieser beiden Compositors verbundenen Einschränkungen und die Auswirkungen der Einschränkungen beim XSD-Authoring hängen jedoch davon ab, auf welche Spezifikation Sie sich beziehen: XSD 1.0 oder XSD 1.1?
Petru Gardea

3
Anscheinend geht es bei Ihrer Frage darum, warum die Sequenz und alle Schreibfehler unterschiedlich sind, wenn ein fehlendes Element gefunden wird. Ich denke, es geht um Parser-Logik
Nasir

Gibt es bereits eine Antwort auf diese Frage? Ich würde auch gerne wissen, ob ich immer <sequence> verwenden muss, um das genaue verpasste Objekt zu erhalten.
GertV

1
Sie erhalten unbefriedigende Antworten, weil Ihr Titel irreführend ist: Die Antworten beantworten die Frage im Titel nach der Bedeutung von "all" vs "sequence" korrekt . Aus Ihren Kommentaren geht hervor, dass Ihr eigentliches Problem darin besteht, wie Ihr Validator Validierungsfehler für beide meldet . Dies ist nicht dasselbe und auf keinen Fall zu beantworten, ohne zu wissen, welchen Validator Sie verwenden.
Joachim Lous

Antworten:


131

<xsd:all> Gibt an, dass die untergeordneten Elemente in beliebiger Reihenfolge angezeigt werden können.

<xsd:sequence> Gibt an, dass untergeordnete Elemente nur in der angegebenen Reihenfolge angezeigt werden können.

Beispiel für Sequenz:

<xs:element name="compElement">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="ele1" type="xs:string"/>
      <xs:element name="ele2" type="xs:string"/>
      <xs:element name="ele3" type="xs:string"/>
      <xs:element name="ele4" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Wenn Sie aus diesem xsd ein XML erstellen, sieht es ungefähr so ​​aus:

<compElement>
  <ele1>First</ele1>
  <ele2>Second</ele2>
  <ele3>Third</ele3>
  <ele4>Fourth</ele4>
</compElement>

Beispiel für alle:

<xs:element name="compElement">
  <xs:complexType>
    <xs:all>
      <xs:element name="ele1" type="xs:string"/>
      <xs:element name="ele2" type="xs:string"/>
      <xs:element name="ele3" type="xs:string"/>
      <xs:element name="ele4" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

Wenn Sie eine XML-Datei aus dieser xsd erstellen, könnte sie ungefähr so ​​aussehen:

<compElement>
  <ele2>Second</ele2>
  <ele1>First</ele1>
  <ele4>Fourth</ele4>
  <ele3>Third</ele3>
</compElement>

Weitere Informationen zu xsd: all
Weitere Informationen zu xsd: sequence

Hoffe ich habe deine Frage beantwortet.


Hallo Joshi. Danke für deine Kommentare. Aber meine Frage ist, wenn ich die XML gegen xsd validiere, während ich xsd verwende: Alles zeigt nicht das exakt fehlende Element. Zum Beispiel Element1 erwartet. Stattdessen werden alle Elemente Element1, Element2, Element3, erwartet, aber ich gab minOccurs = 0 für Element2 und Element3
Benutzer1679378

2
Sie können das Attribut "minOccurs" des Elements "all" als Null angeben. Weitere Informationen finden Sie unter w3schools.com/schema/el_all.asp
Madhusudan Joshi

22

Unterschied:

  • xsd: all - " untergeordnete Elemente können in beliebiger Reihenfolge angezeigt werden und jedes untergeordnete Element kann null oder einmal vorkommen" (dh maxOccurs kann 0 oder 1 sein)
  • xsd: sequence - " untergeordnete Elemente müssen in einer Sequenz erscheinen. Jedes untergeordnete Element kann von 0 bis zu einer beliebigen Anzahl von Malen auftreten" (dh maxOccurs kann 0 oder eine beliebige Anzahl oder 'unbegrenzt' sein)

Aus den W3Schools-Tutorials hier und hier .


4
Sie sollten die Einschränkungen für die Kardinalität des Partikels als spezifisch für XSD 1.0 qualifizieren - andernfalls ist dies für XSD 1.1 falsch.
Petru Gardea

8
w3schools ist nicht mit W3C verbunden, daher sind ihre Webseiten keine W3C-Dokumente.
Ben Companjen

@kamituel Können Sie angeben, wo <xs:all>die Häufigkeit, mit der ein untergeordnetes Element auftreten kann, eingeschränkt ist? Ich kann keine Beweise dafür in der W3C-Spezifikation finden.
Luke Puplett

2
@kamituel Eigentlich gilt das für das gesamte Element selbst in seinem Container im Schema. Das von Ihnen zitierte Dokument ist 1.1, für das die Einschränkung nicht gilt. Wie auch immer, ich habe die Kontraint gefunden, sie ist in "menschlichem Englisch", so wie Sie sie in Ihre Antwort eingefügt haben, ein paar Zeilen oben im 1.0-Dokument.
Luke Puplett

1
"untergeordnetes Element kann null oder einmal vorkommen" ist eigentlich falsch! Der Standardwert ist 1 für minOccurs, was bedeutet, dass es vorhanden sein MUSS. Dies gilt sowohl für alle als auch für die Sequenz.
PKCS12

2

Alle Anzeige

Der <all>Indikator gibt an, dass die untergeordneten Elemente in beliebiger Reihenfolge angezeigt werden können und dass jedes untergeordnete Element nur einmal vorkommen darf:

Sequenzanzeige

Der <sequence>Indikator gibt an, dass die untergeordneten Elemente in einer bestimmten Reihenfolge angezeigt werden müssen:

Referenzlink


2
Sie sollten die Einschränkungen für die Kardinalität des Partikels als spezifisch für XSD 1.0 qualifizieren - andernfalls ist dies für XSD 1.1 falsch.
Petru Gardea

2

Das Schema definiert lediglich, was ein konformes Dokument darstellt.

Wie Verstöße gemeldet werden, liegt ganz beim Validator. Nichts hindert einen Validator daran, genau zu melden, welche Felder fehlen, aber anscheinend verwendet das von Ihnen verwendete Feld in diesem Fall nicht.

Ob dies ein Fehler oder beabsichtigt ist, müssten Sie mit dem Anbieter des Validators besprechen.


Wie beantwortet das die Frage?
Sebastian Hofmann

2
Die Frage scheint nach dem Unterschied zwischen Sequenz und allen zu fragen, aber eine gründlichere Lektüre zeigt, dass der Autor dies bereits weiß, aber durch die Ausgabe seines Validators verwirrt ist. So geht das.
Joachim Lous

2

EINFACHES XML-BEISPIEL:

<school>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</school>

XSD VON OBEN XML (erklärt):

<xs:element name="school">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Hier:

xs: element : Definiert ein Element.

xs: all : Bezeichnet, dass untergeordnete Elemente in beliebiger Reihenfolge angezeigt werden können.

xs: sequence : Bezeichnet, dass untergeordnete Elemente nur in der angegebenen Reihenfolge angezeigt werden.

xs: complexType : Bezeichnet andere Elemente.

xs: simpleType sie keine anderen Elemente enthalten.

Typ: Zeichenfolge, Dezimalzahl, Ganzzahl, Boolescher Wert, Datum, Uhrzeit,

  • Mit einfachen Worten , xsd ist eine weitere Möglichkeit, XML-Daten mit dem spezifischen Typ darzustellen und zu validieren.
  • Mit Hilfe zusätzlicher Attribute können wir mehrere Operationen ausführen.

  • Das Ausführen einer Aufgabe auf xsd ist einfacher als xml.


0

Wenn wir unter Tag verwenden, werden alle Elemente angezeigt, die in diesem complexType deklariert sind, MÜSSEN im XML-Dokument in derselben Reihenfolge angezeigt werden. Andernfalls wird eine Fehlermeldung angezeigt. denn es besteht keine Notwendigkeit, Elemente in der richtigen Reihenfolge anzugeben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.