Różnica między <xsd: all> a <xsd: sequence> w definicji schematu?

82

Używam xsd:allw złożonym typie. Kiedy przegapię jakieś obowiązkowe elementy podczas walidacji, pokaże wszystkie elementy. Nie wyświetli dokładnego pominiętego elementu.

Ale jeśli używam xsd:sequence, mogę uzyskać dokładny pominięty element.

Czy jest jakaś różnica między tymi dwoma?

xsd:sequence: Element XML musi być w tej samej kolejności.

Ale xsd:all: element XML może być dowolną kolejnością.

user1679378
źródło
Zasadniczo różnica między tymi dwoma jest tym, co już wskazałeś w swoim pytaniu. Jednak ograniczenia związane z używaniem tych dwóch kompozytorów i implikacje tych w tworzeniu XSD zależą od tego, do której specyfikacji się odnosisz: XSD 1.0 czy XSD 1.1?
Petru Gardea,
3
Wygląda na to, że twoje pytanie dotyczy tego, dlaczego sekwencja i wszystkie błędy zapisują w inny sposób, gdy znajdują brakujący element. Myślę, że chodzi o logikę parsera
Nasir
Czy jest już odpowiedź na to pytanie? Chciałbym również wiedzieć, czy zawsze muszę używać <sequence>, aby uzyskać dokładny pominięty obiekt.
GertV
1
Otrzymujesz niezadowalające odpowiedzi, ponieważ twój tytuł wprowadza w błąd: Odpowiedzi poprawnie odpowiadają na pytanie w tytule, o znaczenie słowa „wszystko” w porównaniu z „sekwencją”. Z Twoich komentarzy wynika, że ​​Twoim prawdziwym problemem jest różnica w sposobie, w jaki Twój walidator zgłasza błędy walidacji dla tych dwóch. To nie to samo, aw każdym razie niemożliwe jest udzielenie odpowiedzi bez wiedzy, którego walidatora używasz.
Joachim Lous

Odpowiedzi:

134

<xsd:all> określa, że ​​elementy podrzędne mogą pojawiać się w dowolnej kolejności.

<xsd:sequence> określa, że ​​elementy potomne mogą pojawiać się tylko w podanej kolejności.

Przykład sekwencji:

<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>

Jeśli utworzysz XML z tego xsd, będzie on wyglądał mniej więcej tak:

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

Przykład dla wszystkich:

<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>

Jeśli utworzysz plik XML z tego xsd, może to wyglądać mniej więcej tak:

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

Więcej informacji o xsd: all
Więcej informacji o xsd: sequence

Mam nadzieję, że odpowiedziałem na twoje pytanie.

Madhusudan Joshi
źródło
Cześć Joshi ... Dzięki za komentarze, ale moje pytanie brzmi, kiedy sprawdzam xml względem xsd podczas używania xsd: wszystko to nie pokaże dokładnie pominiętego elementu.Na przykład oczekiwano elementu1 ... element3, OCZEKIWANY, ale dałem minOccurs = 0 dla elementu2 i element3
user1679378
2
Atrybut „minOccurs” elementu „all” można określić jako zero. Aby uzyskać więcej informacji, odwiedź w3schools.com/schema/el_all.asp
Madhusudan Joshi
22

Różnica:

  • xsd: all - "elementy potomne mogą występować w dowolnej kolejności, a każdy element potomny może wystąpić zero lub jeden raz" (tj. maxOccurs może mieć wartość 0 lub 1)
  • xsd: sequence - "elementy potomne muszą występować w sekwencji. Każdy element potomny może wystąpić od 0 do dowolnej liczby razy" (tj. maxOccurs może mieć wartość 0 lub dowolną liczbę lub „nieograniczony”)

Z samouczków W3Schools tutaj i tutaj .

kamituel
źródło
4
Powinieneś zakwalifikować ograniczenia dotyczące liczności cząstki jako specyficzne dla XSD 1.0 - w przeciwnym razie jest to niepoprawne dla XSD 1.1.
Petru Gardea,
8
w3schools nie jest stowarzyszona z W3C, więc ich strony internetowe nie są dokumentami W3C.
Ben Companjen
@kamituel Czy możesz cytować, gdzie <xs:all>ograniczenia, ile razy może wystąpić element podrzędny? Nie mogę znaleźć na to dowodów w specyfikacji W3C.
Luke Puplett
2
@kamituel Właściwie dotyczy to całego elementu w jego kontenerze w schemacie. Cytowany dokument to 1.1, który nie zawiera ograniczeń. W każdym razie znalazłem przeciwwagę, jest w „ludzkim angielskim”, tak jak wklejałeś w swojej odpowiedzi, kilka linijek powyżej w dokumencie 1.0.
Luke Puplett
1
„element potomny może wystąpić zero lub jeden raz” jest w rzeczywistości niepoprawne! Wartość domyślna dla minOccurs to 1, co oznacza, że ​​MUSI być obecna i dotyczy to zarówno wszystkich, jak i sekwencji.
PKCS12,
2

Wszystkie wskaźniki

Na <all>wskaźnik określa, że elementy potomne mogą występować w dowolnej kolejności, a każdy element dziecko musi wystąpić tylko raz:

Wskaźnik sekwencji

Na <sequence>wskaźnik określa, że elementy podrzędne muszą pojawić się w określonej kolejności:

link referencyjny

NPKR
źródło
2
Powinieneś zakwalifikować ograniczenia dotyczące liczności cząstki jako specyficzne dla XSD 1.0 - w przeciwnym razie jest to niepoprawne dla XSD 1.1.
Petru Gardea,
2

Schemat określa jedynie, co stanowi zgodny dokument.

Sposób zgłaszania niezgodności zależy wyłącznie od walidatora. Nic nie stoi na przeszkodzie, aby walidator zgłosił dokładnie, których pól brakuje, ale najwyraźniej ten, którego używasz, nie jest w tym przypadku.

Niezależnie od tego, czy jest to błąd, czy projekt, musisz omówić z dostawcą walidatora.

Joachim Lous
źródło
Jak to odpowiada na pytanie?
Sebastian Hofmann
2
Wydaje się, że pytanie dotyczy różnicy między sekwencją a wszystkim, ale dokładniejsza lektura ujawnia, że ​​autor już to wie, ale jest zdumiony wynikami jego walidatora. Właśnie tak.
Joachim Lous
2

PROSTY PRZYKŁAD XML:

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

XSD POWYŻEJ XML (wyjaśnione):

<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>

Tutaj:

xs: element : definiuje element.

xs: all : oznacza, że ​​elementy podrzędne mogą pojawiać się w dowolnej kolejności.

xs: sequence : oznacza, że ​​elementy podrzędne pojawiają się tylko w podanej kolejności.

xs: complexType : oznacza, że ​​zawiera inne elementy.

xs: simpleType : Oznacza, że ​​nie zawierają innych elementów.

typ: string, decimal, integer, boolean, date, time,

  • Mówiąc prościej , xsd to inny sposób reprezentowania i sprawdzania poprawności danych XML za pomocą określonego typu.
  • Za pomocą dodatkowych atrybutów możemy wykonać wiele operacji.

  • Wykonywanie dowolnego zadania na xsd jest prostsze niż xml.

shubham1js
źródło
0

kiedy używamy znacznika under, oznacza to, że wszystkie elementy zadeklarowane w tym typie złożonym MUSZĄ pojawić się w tej samej kolejności w dokumencie XML. w przeciwnym razie pojawi się błąd. bo nie ma potrzeby określania elementów w odpowiedniej kolejności.

user3423648
źródło