Разница между <xsd: all> и <xsd: sequence> в определении схемы?

81

Я использую xsd:allсложный тип. Когда я пропущу какие-либо обязательные элементы при проверке, он покажет все элементы. Он не будет отображать точный пропущенный элемент.

Но если я использую, xsd:sequenceя могу получить именно тот пропущенный элемент.

Есть ли разница между этими двумя?

xsd:sequence: Элемент XML должен быть в том же порядке.

Но xsd:all: элемент XML может иметь любой порядок.

user1679378
источник
По сути, разница между ними заключается в том, что вы уже указали в своем вопросе. Однако ограничения, связанные с использованием этих двух композиторов, и последствия этих ограничений при разработке XSD зависят от того, на какую спецификацию вы ссылаетесь: XSD 1.0 или XSD 1.1?
Петру Гардеа
3
Похоже, ур вопрос о том, почему последовательность и все записывают ошибку по-разному, когда находят отсутствующий элемент. Я думаю, дело в логике парсера
Насир
Есть ли уже ответ на этот вопрос? Я также хотел бы знать, всегда ли мне нужно использовать <sequence>, чтобы получить точный пропущенный объект.
GertV
1
Вы получаете неудовлетворительные ответы, потому что ваш заголовок вводит в заблуждение: ответы правильно отвечают на вопрос в заголовке о значении «все» против «последовательности». Из ваших комментариев кажется, что ваша настоящая проблема - это разница в том, как ваш валидатор сообщает об ошибках валидации для двух. Это не одно и то же, и в любом случае невозможно ответить, не зная, какой валидатор вы используете.
Иоахим Лоус

Ответы:

134

<xsd:all> указывает, что дочерние элементы могут появляться в любом порядке.

<xsd:sequence> указывает, что дочерние элементы могут появляться только в указанном порядке.

Пример последовательности:

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

Если вы создадите XML из этого xsd, он будет выглядеть примерно так:

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

Пример для всех:

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

Если вы создадите XML-файл из этого xsd, он может выглядеть примерно так:

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

Подробнее о xsd: все
Подробнее о xsd: sequence

Надеюсь, я ответил на твой вопрос.

Мадхусудан Джоши
источник
Привет, Джоши .. Спасибо за ваши комментарии. Но мой вопрос в том, когда я проверяю xml на xsd при использовании xsd: все, что он не покажет точный пропущенный элемент. Например, ожидается element1 .. Вместо этого он покажет все элементы element1, element2, element3, ОЖИДАЕТСЯ, но я дал minOccurs = 0 для element2 и element3
user1679378
2
Вы можете указать атрибут minOccurs элемента all как ноль. Для получения более подробной информации посетите w3schools.com/schema/el_all.asp
Мадхусудан Джоши
22

Разница:

  • xsd: all - «дочерние элементы могут появляться в любом порядке, и каждый дочерний элемент может встречаться ноль или один раз» (т.е. maxOccurs может быть 0 или 1)
  • xsd: sequence - «дочерние элементы должны появляться в последовательности. Каждый дочерний элемент может встречаться от 0 до любого количества раз» (т. е. maxOccurs может быть 0, любым числом или «неограниченным»)

Из руководств W3Schools здесь и здесь .

Kamituel
источник
4
Вы должны квалифицировать ограничения на мощность частицы как специфические для XSD 1.0 - в противном случае это неверно для XSD 1.1.
Петру Гардеа
8
w3schools не связаны с W3C, поэтому их веб-страницы не являются документами W3C.
Бен Компаньен
@kamituel Можете ли вы указать, где <xs:all>ограничивает количество раз, когда дочерний элемент может встречаться? Я не могу найти доказательства этого в спецификации W3C.
Люк Пуплетт,
2
@kamituel Фактически, это относится ко всему самому элементу в его контейнере в схеме. Документ, который вы цитируете, - 1.1, который не имеет ограничения. В любом случае, я нашел ограничение, оно на "человеческом английском", как вы вставили в свой ответ, несколькими строками выше в документе 1.0.
Люк Пуплетт
1
"дочерний элемент может встречаться ноль или один раз" на самом деле неверно! Значение по умолчанию для minOccurs - 1, что означает, что он ДОЛЖЕН присутствовать, и это относится как ко всем, так и к последовательности.
PKCS12
2

Индикатор All

В <all>индикатор указывает , что дочерние элементы могут появляться в любом порядке, и что каждый дочерний элемент должен происходить только один раз:

Индикатор последовательности

В <sequence>индикатор указывает , что дочерние элементы должны появляться в определенном порядке:

ссылка на ссылку

НПКР
источник
2
Вы должны квалифицировать ограничения на мощность частицы как специфические для XSD 1.0 - в противном случае это неверно для XSD 1.1.
Петру Гардеа
2

Схема просто определяет, что составляет соответствующий документ.

Как сообщить о несоответствии, полностью зависит от валидатора. Ничто не мешает валидатору сообщать, какие именно поля отсутствуют, но, очевидно, тот, который вы используете, в данном случае не делает.

Является ли это ошибкой или умышленно, вам придется обсудить это с поставщиком валидатора.

Иоахим Лоус
источник
Как это отвечает на вопрос?
Себастьян Хофманн
2
Этот вопрос, кажется, задает вопрос о разнице между последовательностью и всем, но более тщательное чтение показывает, что автор уже знает это, но озадачен выводом своего валидатора. Вот как.
Иоахим Лоус
2

ПРОСТОЙ ПРИМЕР XML:

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

XSD ВЫШЕ XML (объяснено):

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

Вот:

xs: element : определяет элемент.

xs: all : обозначает, что дочерние элементы могут появляться в любом порядке.

xs: sequence : обозначает, что дочерние элементы появляются только в указанном порядке.

xs: complexType : означает, что он содержит другие элементы.

xs: simpleType : Означает, что они не содержат других элементов.

тип: строка, десятичное число, целое число, логическое значение, дата, время,

  • Проще говоря , xsd - это еще один способ представления и проверки XML-данных определенного типа.
  • С помощью дополнительных атрибутов мы можем выполнять несколько операций.

  • Выполнить любую задачу на xsd проще, чем на xml.

shubham1js
источник
0

когда мы используем тег under, он указывает, что все элементы, объявленные в этом complexType, ДОЛЖНЫ появляться в документе XML в том же порядке. в противном случае вы получите ошибку. поскольку нет необходимости указывать элементы в правильном порядке.

user3423648
источник