XMLSpy игнорирует "minOccurs"? Почему этот XML действителен? - PullRequest
1 голос
/ 08 сентября 2010

Пожалуйста, объясните мне, почему XML Spy считает, что это действительно . К вашему сведению, это указывает на запрос SQL. Здесь XML :

 <sideBar title="LabelSearch">
  <searchLabel table="ID=*.companies">
   <filter accessRight="r">
    <and>
     <filterElement argument="companies.Type" operator="=" value="Client"/>
    </and>
   </filter>
  </searchLabel>
 </sideBar>

Проблема: мне нельзя разрешать вставлять только один filterElement внутри тега "и", но как минимум два. Если у меня есть только один filterElement, я должен использовать его без тега «and». Здесь 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>

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 10 сентября 2010

Кратко

  1. Документ действителен, потому что элементы имеют minOccurs="0".
  2. Используйте <xs:choice> вместо <xs:sequence>.

Немного более длинный ответ.

Точно так же, как @Damien сказал, что XML допустим, потому что эта часть вашей схемы допускает «пустые» последовательности.

<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:sequence minOccurs="2" maxOccurs="unbounded"> Вы определяете, что «эта последовательность должна появляться как минимум дважды». В то же время <xs:element name="or" type="filterGroupOrType" minOccurs="0"/> Позволяет этим элементам в последовательности отсутствовать. Метафорически это все равно, что сказать: «Вы должны заказывать еду дважды, но вам не нужно есть то, что вы заказали».

Вместо этого, если вы хотите всегда иметь как минимум 2 дочерних элемента, и эти дочерние элементы могут быть <filterElement> или <or> элементами в любом порядке, вы должны использовать <xs:choice> с 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>

Значение по умолчанию для minOccurs равно 1, так что вы можете оставить его и сохранить свой код чище и короче. <xs:choice> выбирает одного из его дочерних элементов и повторяет выбор не менее minOccurs раз. Если хотя бы один из вариантов может иметь minOccurs="0", тогда выбор также разрешит "пустой" выбор.

2 голосов
/ 08 сентября 2010

У вас есть minOccurs = "0" на filterElement. Таким образом, один filterElement можно рассматривать как filterElement 0 раз, за ​​которым следует filterElement. Действительная последовательность. Возможно, вам следует избегать смешивания minOccurs в xs: sequence и xs: element в вашей схеме ...

0 голосов
/ 10 сентября 2010

У вас есть последовательность, которая должна встречаться дважды, но элементы в последовательности являются необязательными (minOccurs = "0").Сама последовательность не представляет никакого XML, она просто определяет возможные элементы, которые она может содержать, и порядок, в котором они должны быть. В этом случае вполне допустимая последовательность может быть пустой.

Заменаси изменение minOccurs на 1 для подэлементов сработает, если вам все равно, в каком порядке появляются элементы, и похоже, что вы этого не делаете.Если вы не установите minOccurs равным 1 для дочерних элементов, тогда допустимым выбором будет элемент, встречающийся 0 раз, и ваш XML будет проверен.Если вы установите для minOccurs значение 2 для дочерних элементов, то у вас будет минимум 4 элемента, поскольку вы сделаете выбор дважды и выберете каждый дочерний элемент, встречающийся дважды каждый раз.

...