Xsi nil true что означает
Lawnmower — один из продуктов в заказе на покупку, перечисленный в po . xml , не имеет элемента shipDate . В пределах контекста нашего сценария, автор схемы может преднамеренно пропустить указание элементов item , которые еще не отправлены. Вообще пропуск элемента не имеет никакого особого смысла. Это может лишь указывать, что информация неизвестна, неподходящая, или есть какая-либо другая причина, по которой элемент может отсутствовать. Иногда предпочтительнее представить сведения о неотправленном продукте item (неизвестную информацию, или информацию явно с элементом не связанную), чем пропустить элемент. Например, желательно указывать значение " null " для элементов, которые посылаются или извлекаются из реляционных баз данных. Для таких случаев XML Schema представляет механизм nil , который дает возможность элементу появляться как с нулевым, так и ненулевым значением.
Механизм Nil XML Schema подразумевает нулевое значение. В реальности же никакого нулевого значения, которое появляется как содержимое элемента, нет. Вместо этого есть атрибут, указывающий, что содержимое элемента — nil . Для иллюстрации мы изменим объявления элемента shipDate так, чтобы нулевые значения могли быть показаны:
<xsd:element name=”shipDate” type=”xsd:date” nillable=”true”/>
Теперь явно представим shipDate с нулевым значением в экземпляре документа. Для этого установим атрибут nil (из пространства имен XML Schema ) равный true:
Атрибут nil определен как часть пространства имен XML Schema http :// www . w 3. org /2001/ XMLSchema — instance для экземпляров документов. Поэтому он должен появляться в экземпляре документа с префиксом xsi: , который связывает его с этим пространством имен. (Как и префикс xsd : , префикс xsi : используется в соответствии с соглашением при описании пространства имен.) Отметим, что nil механизм применяется только для значений элементов. Со значениями атрибутов он не применяется. Элемент с xsi : nil =" true " может не иметь элементов содержания, но, тем не менее, включать атрибуты.
Xml Element Attribute. Is Nullable Свойство
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает или задает значение, которое указывает, должен ли XmlSerializer сериализовать члена, имеющего значение null , в качестве пустого тега с атрибутом xsi:nil со значением true .
Значение свойства
true , если XmlSerializer создает атрибут xsi:nil ; в противном случае — false .
Примеры
В следующем примере показано поле с примененным XmlElementAttribute к нему полем и свойством IsNullable , равным false .
Комментарии
Спецификация XML-схемы для структур позволяет XML-документу явно сигнализировать о том, что содержимое элемента отсутствует. Такой элемент содержит атрибут xsi:nil , равный true . Дополнительные сведения см. в спецификации консорциума World Wide Web Consortium, часть 1. Структура.
IsNullable Если свойство имеет значение true , xsi:nil атрибут создается для членов класса, для которых задано значение null . Например, если задать для поля имя MyStringArray null , XmlSerializer создается следующий XML-код.
IsNullable Если свойство имеет значение false , xml-элемент не создается для членов класса, для которых задано значение null .
Невозможно применить IsNullable свойство к члену, типизированному как типу значения, так как тип значения не может содержать null . Кроме того, это свойство false нельзя задать для типов значений, допускающих значение NULL. Если такие типы являются null , они будут сериализованы путем установки значения xsi:nil true .
Представление нулевых значений в схеме XML
Компонентная объектная модель для Java, известная как Java beans, имеет определенные свойства, называемые полями. Эти поля могут иметь нулевые значения, если только они не являются полями примитивного типа. При преобразовании («мэппировании») Java beans в XML эти поля становятся элементами или атрибутами. Простые элементы и атрибуты не могут иметь нулевых значений (их можно рассматривать как своего рода эквиваленты примитивным типам Java, которые также не могут иметь нулевых значений). Существует несколько способов изменить атрибуты и элементы XML таким образом, чтобы их экземпляры имели нулевое значение (или хотя бы логически были эквивалентны нулю):
- для атрибутов:
- использовать атрибут use=»optional»;
- использовать атрибут nillable=»true»;
- или использовать атрибут minOccurs=»0″.
В предлагаемой статье обсуждаются детали и варианты каждого из этих способов.
Элементы и атрибуты
Прежде чем рассматривать представления нулевых значений, необходимо решить, что будет использоваться для поля объекта, — элемент или атрибут. В первую очередь нужно определить тип этого поля. В атрибутах могут использоваться только простые типы. Таким образом, при наличии сложного типа выбор однозначен — должен использоваться элемент. Но в случае простого типа вопрос остается: что лучше — атрибут или элемент? Например, при наличии структуры, приведенной в листинге 1, что окажется лучше: attrField или elemField?
Листинг 1. Схема AttributeOrElement
В листинге 2 представлен экземпляр схемы листинга 1.
Листинг 2. Экземпляр AttributeOrElement
Ясно видно, что поле атрибута занимает меньше места в экземпляре, чем поле элемента. Соответственно, сообщения SOAP, которые переносят документы в формате XML, содержащие атрибуты, также будут меньше, что сократит время их передачи. Таким образом, кажется, что атрибуты оказываются предпочтительнее элементов. Но те специалисты, кто уже давно работает со схемами, могли заметить, что атрибуты используются не так уж часто. Возникает вопрос: почему? Автор затрудняется назвать точную причину, но приводит несколько аргументов:
- поскольку элементы в обязательном порядке используются для сложных типов, то для единообразия их используют и для простых типов. В результате схемы выглядят проще;
- «свернутый» шаблон документ/буквенный требует, чтобы элемент верхнего уровня complexType не содержал атрибутов (см. статью «Какой стиль WSDL лучше использовать» (Which style of WSDL should I use?) в разделе Ресурсы). Поскольку список параметров того элемента может включать только элементы, то и все списки сложного типа также должны включать только элементы для соблюдения единообразия;
- поскольку атрибуты и элементы не упорядочены (если только не используется тэг <all>), то существует вероятность того, что синтаксический разбор атрибутов может оказаться дороже, чем проверка элементов (хотя автор выражает сомнение в том, что это имеет значение для сложных парсеров XML).
Автор рекомендует использовать элементы для большей простоты, если только не стоит проблема увеличения пропускной способности. В этом случае можно проверить опытным путем, помогут ли атрибуты поднять производительность.
Нулевой атрибут
Как уже говорилось выше, атрибут можно сделать логически нулевым, если он будет необязательным. В листинге 3 приведена схема с атрибутом, который может быть нулевым, а в листинге 4 даны примеры экземпляров, один из которых имеет некоторое значение в поле, а другой — нет.
Листинг 3. Схема TypeWithNullAttribute
Листинг 4. Экземпляры TypeWithNullAttribute
Атрибут со значением:
Атрибут, переданный как нулевой:
Из этих примеров видно, что в схеме нулевой атрибут объявлен очень просто. Экземпляр нулевого атрибута также выражен очень просто — он отсутствует.
Нулевые элементы
Существует два способа представить нулевое значение, используя элементы: с помощью атрибутов nillable=»true» или minOccurs=»0″. В листинге 5 показана схема для оператора TypeWithNullElements, содержащая по одному элементу для каждого из стилей полей, которые могут иметь нулевое значение.
Листинг 5. Схема для TypeWithNullElements
В листинге 6 показаны экземпляры для TypeWithNullElements. Первая из них содержит нормальные значения, а вторая — нулевые.
Листинг 6. Экземпляры TypeWithNullElements
Элементы со значениями:
Элементы с нулевыми значениями:
Как и необязательный атрибут, элемент с атрибутом minOccurs=»0″, имеющий нулевое значение, просто отсутствует в экземпляре XML. Это способствует уменьшению размера сообщения, в отличие от того варианта, когда элемент определяется с помощью атрибута nillable=»true». Атрибут nillableElem, даже имея нулевое значение, включает поле для значения, которое показывает, что значение этого атрибута действительно равно нулю.
Когда атрибут nillable=»true» оказывается полезен
Если атрибут minOccursElem настолько лучше, чем атрибут nillableElem, то зачем последний может вообще понадобиться? Как было только что сказано, нулевое значение атрибута nillableElem имеет определенное поле для значения. В каком случае это может оказаться полезным? Один из примеров — массив, в котором каждый элемент потенциально может иметь нулевое значение. Вот пример такого массива из четырех элементов: <0, null, 1, null>. Как можно представить этот массив, используя экземпляр элемента minOccursElem? Ответ — никак. Такой массив из четырех элементов будет неотличим от следующего массива из двух элементов: <0, 1>. При использовании элементов minOccurs=»0″ нет поля для нулевых элементов. Поэтому при данном сценарии обязательно нужно использовать элементы nillable=»true». В листинге 7 показана схема для такого массива, а в листинге 8 — экземпляр XML для массива <0, null, 1, null>.
Листинг 7. Схема для элементов массива, значение которых может быть нулевым
Листинг 8. Экземпляр XML для элементов массива, значение которых может быть нулевым
Заключение
Существует три способа представления нулевых полей в схеме XML: необязательные атрибуты, элементы minOccurs=»0″ и элементы nillable=»true». Каждый из них используется в определенной ситуации. Необязательный атрибут используется в случае простого типа, значение которого может быть равно нулю; элемент minOccurs=»0″ — в случае сложного типа, значение которого может быть равно нулю, если требуется сэкономить место; элемент nillable=»true» — если нулевое значение должно иметь определенное поле (например, когда оно входит в состав массива).