#xml #xsd #xsd-validation
#xml #xsd #xsd-проверка
Вопрос:
В файле XSD у меня есть элемент с двузначным номером price="90"
, но я хочу, чтобы он также принимал empty. Какой тип данных должен быть указан в XSD ?!
Ответ №1:
вы можете сделать элемент nillable .
<xs:element name="Price"
nillable="true">
<xs:simpleType>
<xs:restriction base="xs:int">
<xs:totalDigits value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Комментарии:
1. Но если вы это сделаете, он будет принимать пустое значение только в том случае, если в элементе указано
xsi:nil="true"
, что довольно неуклюже.
Ответ №2:
Мой предпочтительный подход заключается в определении элемента как имеющего тип списка:
<xs:simpleType name="twoDigitNumber">
<xs:restriction base="xs:int">
<xs:totalDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="listOfTwoDigitNumbers">
<xs:list itemType="twoDigitNumber"/>
</xs:simpleType>
<xs:simpleType name="optionalTwoDigitNumber">
<xs:restriction base="listOfTwoDigitNumbers">
<xs:maxLength value="1"/>
</xs:restriction>
</xs:simpleType>
Другой популярный подход заключается в определении типа объединения с типами членов, представляющими собой (а) двузначное целое число и (б) строку с maxLength=0. Два подхода дают одинаковый эффект с точки зрения проверки, но будут работать по-разному, если вы используете технологии привязки данных или выражения XPath с поддержкой схемы.
Я не большой поклонник nillable/ xsi:nil . Просить людей помечать пустые экземпляры с xsi:nil
помощью, когда совершенно очевидно, что элемент пуст, похоже, не служит никакой полезной цели; и это не работает для атрибутов.
Комментарии:
1. Согласен, что этот
xsi:nil
вариант не самый лучший, и ваш выглядит более чистым на выходе, но также сложным в схеме. К сожалению, некоторые генераторы кода (например, xsd2code) не могут работать с такими схемами. Он создал строковое свойство на основе схемы. Но я буду иметь это в виду. Первый коллега, который жалуется наxsi:nil
, получит ваше решение.