#xml #xsd
#xml #xsd
Вопрос:
Мне нужно проверить XML с некоторыми обязательными и некоторыми неизвестными элементами.
Проблема в том, что xs:any
ожидается, что внутри xs:sequence
Также применяется правило UPA (принадлежит ли неизвестный элемент к xs:any
или он принадлежит необязательному элементу minOccurs="0"
?).
XML:
<person>
<name>John</name> <!-- required -->
<address>Lane 1</address> <!-- optional -->
<unknown>someValue</unknown> <!-- unknown -->
<status>1</status> <!-- required -->
</person>
Мой лучший снимок (на самом деле: мое пожелание, как это должно работать):
<xs:complexType name="person">
<xs:sequence>
<xs:element name="name" minOccurs="1" maxOccurs="1" />
<xs:element name="address" minOccurs="0" maxOccurs="1" />
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
<xs:element name="status" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
Но согласно всей документации, это не разрешено.
Я также пробовал различные способы вложенности, например:
<xs:all>
<xs:sequence>
Однако я пока не смог найти решение.
Есть ли у кого-нибудь решение, как объединить требуемые с неизвестными элементами?
Ответ №1:
Ответ на удивление прост: используйте XSD 1.1
Затем фактически будет выполнено следующее.
Обратите внимание на <xs:all>
: правильный порядок элементов больше не требуется.
<xs:complexType name="person">
<xs:all>
<!-- Required -->
<xs:element name="name"/>
<xs:element name="status"/>
<!-- Optional -->
<xs:element name="address" minOccurs="0"/>
<!-- Unknown-->
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
</xs:all>
</xs:complexType>
(Например, в XMLSpy: инструменты -> параметры -> Всегда версия v1.1)