Атрибуты элемента nillable и minOccurs XSD

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

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

Ответ 1

Вам нужно решить, думаете ли вы о 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 - это способ сделать это. Если вы откажетесь на что-нибудь, что может быть объектом, инструментальные средства будут досадно использовать массив, чтобы найти способ представления отсутствия.

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

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