Допустимо ли устанавливать nillable = true и использовать свойство по умолчанию в документе XML? - PullRequest
0 голосов
/ 09 декабря 2011

Использование C # и .Net 4.0

У меня есть сгенерированная схема, которая выглядит следующим образом:

<xsd:element name="EstimatedDate" minOccurs="0" nillable="true" default="1900-01-01T00:00:00">
  <xsd:complexType>
       <xsd:simpleContent>
           <xsd:extension base="xsd:dateTime">
                <xsd:attribute name="origVal" type="xsd:dateTime" use="optional" />
           </xsd:extension>
       </xsd:simpleContent>
  </xsd:complexType>

Когда я сериализую объект с нулевым значением, я получаю:

<EstimatedDate xsi:nil="true" />

Но я получаю десериализацию: «Не должно быть фиксированного значения, когда атрибут равен« xsi: nil »и имеет значение« true ».»

Когда я смотрю на спецификацию XML, я не вижу, что nillable и свойства по умолчанию являются взаимоисключающими, но мои другие типы XML dateTime, которые имеют nillable, но не имеют свойства по умолчанию, работают правильно.

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Сообщение об ошибке описывает ограничение, которое присутствует в спецификации: Правило валидации: элемент локально действительный (элемент) в разделе 3.3.2 говорит, что когда xsi: nil = true, не должно быть фиксированного значения. Тем не менее, насколько я вижу, запрет на значение по умолчанию отсутствует, поэтому, похоже, ваш процессор схемы слишком стремится найти ошибку.

Я думаю, что правильное поведение для вашей схемы: если элемент пуст, а xsi: nil отсутствует или false, используйте значение по умолчанию; если элемент пустой и значение xsi: nil равно true, оставьте его как есть.

(вы можете попытаться заставить Microsoft исправить это, или вы можете попробовать переключиться на Saxon ...)

1 голос
/ 09 декабря 2011

Я думаю, что, возможно, это одна из этих запутанных областей в спецификации XML-схемы (достаточно интересно, что даже спецификация 1.1 только отменяет комбинацию по умолчанию и фиксированную комбинацию); если вы считаете, что значения по умолчанию для элементов применяются, когда элементы присутствуют и пусто , и что у заштрихованных элементов не должно быть никакого содержимого, то имеет смысл запутаться какой это: ноль или по умолчанию? Другими словами, когда оба условия присутствуют, какое из них имеет приоритет? Я полагаю, десериализатор как бы просит помощи ...

...