Порада з Web-сервісів Подання порожніх значень у схемі XML

Серія контенту:
Цей контент є частиною # із серії # статей: Рада з Web-сервісів
Цей контент є частиною серії: Рада з Web-сервісів
Слідкуйте за виходом нових статей цієї серії.
Компонентна об'єктна модель Java, відома як Java beans, має певні властивості, звані полями. Ці поля можуть мати нульові значення, якщо вони не є полями примітивного типу. Під час перетворення ("мепування") Java beans в XML ці поля стають елементами або атрибутами. Прості елементи та атрибути не можуть мати нульових значень (їх можна розглядати як свого роду еквіваленти примітивним типу Java, які також не можуть мати нульових значень). Існує кілька способів змінити атрибути та елементи XML таким чином, щоб їх екземпляри мали нульове значення (або хоча б логічно еквівалентні нулю):
- для атрибутів:
- використовувати атрибут use="optional";
У запропонованій статті обговорюються деталі та варіанти кожного з цих способів.
Елементи та атрибути
Перш ніж розглядати уявлення порожніх значень, необхідно вирішити, що використовуватиметься поля об'єкта, - елемент чи атрибут. Насамперед потрібно визначити тип цього поля. Атрибути можуть використовувати лише прості типи. Таким чином, за наявності складного типу вибір однозначний – має використовуватися елемент. Але у разі простого типу питання залишається: що краще – атрибут чи елемент? Наприклад, за наявності структури, наведеної в лістингу 1, що виявиться краще:attrField або elemField?
Лістинг 1. Схема AttributeOrElement
У лістингу 2 представлений екземпляр схеми лістингу 1.
Лістинг 2. Примірник AttributeOrElement
Зрозуміло, що поле атрибута займає менше місця в екземплярі, ніж поле елемента. Відповідно, повідомлення SOAP, які переносять документи у форматі 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 має певне поле значення. У якому разі це може бути корисним? Один із прикладів - масив, в якому кожен елемент потенційно може мати нульове значення. Ось приклад такого масиву із чотирьох елементів: . Як можна уявити цей масив, використовуючи екземпляр елемента minOccursElem ? Відповідь – ніяк. Такий масив із чотирьох елементів буде невідмінним від наступного масиву із двох елементів: . Під час використання елементів minOccurs="0" немає поля для нульових елементів. Тому за даного сценарію обов'язково потрібно використовувати елементи nillable="true" . У лістингу 7 показана схема такого масиву, а лістинге 8 - екземпляр XML для масиву .
Лістинг 7. Схема для елементів масиву, значення яких може бути нульовим
Лістинг 8. Примірник XML для елементів масиву, значення яких може бути нульовим
Висновок
Існує три способи представлення нульових полів у схемі XML: необов'язкові атрибути, елементи minOccurs="0" та елементи nillable="true". Кожен із них використовується у певній ситуації. Необов'язковий атрибут використовується у разі простого типу, значення якого може дорівнювати нулю; елемент minOccurs="0" - у разі складного типу, значення якого може дорівнювати нулю, якщо потрібно заощадити місце; елемент nillable="true" - якщо нульове значення повинно мати певне поле (наприклад, коли воно входить до складу масиву).