Nillable и minOccurs атрибуты элемента XSD - PullRequest
35 голосов
/ 14 декабря 2009

Я иду туда и обратно с установкой элемента на minOccurs="0" и nillable="true".

Я читал эту статью, и теперь в моем WSDL я не уверен, стоит ли использовать оба варианта. В статье приведен хороший пример представления массивов, в которых пустые значения могут быть разбросаны по всему, поскольку это невозможно сделать только с помощью minOccurs="0". Соглашение, с которым я столкнулся, заключается в том, что если элемент не является необязательным, он не может быть обнуляемым. Разница, насколько я понимаю, и где мой вопрос заключается в том, что, применяя свойство nillable к элементу, я говорю, что вы можете передать в XSD эквивалент значения NULL? В противном случае элемент без свойства nillable должен иметь значение в пределах установленного ограничения?

1 Ответ

56 голосов
/ 14 декабря 2009

Вам нужно решить, думаете ли вы о XML как о XML или о XML как о способе передачи Java (или другого) объекта отсюда туда.

В XML nillable разрешает конструкцию <myelement xsi:nil='true'/> в качестве индикатора явного отсутствующего значения, такого как SQL NULL. Это семантически отличается от просто <myelement/>. И оба совершенно ничем не отличаются. Итак, при рассмотрении XML вы должны различать четыре случая:

<!-- nothing -->
<myElement attr1='true'>some content</myElement>
<myElement/>
<myElement xsi:nil='true'/>

Если, с другой стороны, вас больше всего интересует Java - возможно, из-за того, что вы используете SOAP, вам нужно подумать о том, как карта объектов Java перемещается туда и обратно.

Для любого элемента Java, который наследуется от Object, JAXB и другим картографическим технологиям необходим способ работы с нулевыми значениями. Nillable это способ сделать это. Если вы запрещаете nillable для чего-либо, что может быть объектом, наборы инструментов будут раздражающе использовать массив, чтобы найти способ представить отсутствие.

С другой стороны, если у вас есть массив, имейте в виду, что сам массив является объектом и может быть нулевым. Таким образом, каждый инструментарий должен отличать массив с нулевым элементом от нулевого.

С другой стороны, если у вас есть примитивный тип (например, int), nillable приведет к проблемам, поскольку нет преобразования xsi: nil в примитив.

...