Как сделать элементы необязательными в <xs: all>?
У меня такой xsd. Эти все поля могут существовать или нет и в непредсказуемом порядке.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="request">
<xs:complexType>
<xs:all minOccurs="0">
<xs:element ref="field1"/>
<xs:element ref="field2"/>
<xs:element ref="field3"/>
<xs:element ref="field4"/>
<xs:element ref="field5"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
Поле 4 не существует в xml, и валидатор говорит, что он ждет поле4, но он не должен этого говорить. Итак, что не так?
w3cschools.com говорит
<xs:element name="person">
<xs:complexType>
<xs:all minOccurs="0">
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
В приведенном выше примере указано, что элементы "firstname" и "lastname" могут отображаться в любом порядке, и каждый элемент CAN может появляться в ноль или один раз!
Ответы
Ответ 1
Вам нужно поставить minOccurs
на отдельные элементы, а не на <xs:all>
, i.e.
<xs:all>
<xs:element ref="field1" minOccurs="0"/>
<xs:element ref="field2" minOccurs="0"/>
<xs:element ref="field3" minOccurs="0"/>
<xs:element ref="field4" minOccurs="0"/>
<xs:element ref="field5" minOccurs="0"/>
</xs:all>
Ввод minOccurs="0"
в <xs:all>
означает, что целая группа может быть опущена, а не отдельные элементы.
См. Документы XML-схемы.
Ответ 2
попробуйте сделать это во всех
<xs:element ref="field4" minOccurs="0" >