XSD: Яка різниця між xs: integer та xs: int?


111

Я почав створювати XSD і знайшов у кількох прикладах для xs:integerі xs:int.

У чому різниця між xs:integerі xs:int? Коли я повинен використовувати xs:integer? Коли я повинен використовувати xs:int?

Відповіді:


110

Різниця полягає в наступному: xs:intце підписане 32-бітове ціле число. xs:integer- ціле безмежне значення. Докладніше див. Https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp Наприклад, XJC (Java) генерує Integerдля xs:intта BigIntegerдля xs:integer.

Суть: використовуйте, xs:intякщо ви хочете працювати на крос-платформах і будьте впевнені, що ваші номери пройдуть без проблем. Якщо ви хочете більші числа - використовуйте xs:longзамість xs:integer(це буде створено для Long).


2
Saxon 9 HE (Домашня редакція) підтримує лише 'xs: integer , but not xs: int` або xs:long.
Ніші

13
w3cshools не є авторитетним. Чому б не посилатися на відповідні визначення? w3.org/2001/XMLSchema.xsd стверджує, що ціле число, наприклад, пов'язане з +/- 9223372036854775808. Крім того, крос-платформа не має нічого спільного з (сумісним) xml.
Пол Харгрівз

@Nishi, звучить як Saxon 9 HE не відповідає. Читаючи сторінку saxon.sourceforge.net, здається, що лише версія EE відповідає.
Пол Харгрівз

2
@PaulHargreaves, Saxon 9 HE є (наскільки я знаю) повністю сумісним процесором XSLT: xs: int не в наборі типів, необхідний для підтримки базового процесора XSLT . Якщо ви маєте на увазі, що це не відповідний процесор XSD, це правда, але вводить в оману: це зовсім не XSD-процесор.
CM CM Sperberg-McQueen

8
@PaulHargreaves, ваш коментар про +/- 9223372036854775808 бути максимум «хз: ціле» невірно: в XMLSchema.xsd визначає , що «хз: довгий» є обмеження «хз: ціле число» до +/- 9223372036854775808
metatechbe

30

Тип xs: integer - це обмеження xs: десятковий, з фасетом дробDigits встановлено нуль і з лексичним простором, який забороняє десяткову точку і кінцеві нулі, що в іншому випадку було б законним. Він не має мінімального або максимального значення, хоча реалізації, що працюють на машинах обмеженого розміру, не потрібно приймати довільно великі або малі значення. (Вони потрібні для підтримки значень з 16 десятковими цифрами.)

Тип xs: int є обмеженням xs: long, фасета maxInclusive встановлена ​​на 2147483647, а фасета minInclusive - -2147483648. (Як бачите, воно зручно впишеться в 32-розрядне 32-бітове поле з підписами-цілим числом; xs: long вписується в 64-бітне поле з підписами-цілим числом.)

Звичайне правило: використовуйте те, що відповідає тому, що ви хочете сказати. Якщо обмеження для елемента або атрибута полягає в тому, що його значення повинно бути цілим числом, xs: integer говорить це стисло. Якщо обмеженням є те, що значення повинно бути цілим числом, яке може бути виражене щонайбільше 32 бітами у представленні двоє доповненнями, використовуйте xs: int. (Друга, але іноді важлива проблема - чи краще ваш ланцюжок інструментів працює з одним, ніж з іншим. Для даних, які живуть довше, ніж ланцюг ваших інструментів, розумно спочатку слухати дані; для даних, які існують лише для подачі інструменту ланцюг, і що не буде цікаво, якщо ви заміните ланцюжок інструментів, немає причин не слухати ланцюжок інструментів.)


Ви: впровадження, що працюють на машинах обмеженого розміру, не потрібно [...] Чи стандарт має вимогу, щоб реалізації, які працюють на нескінченних машинах (наприклад, машини Тьюрінга та інше), приймали та належним чином представляли весь діапазон? :-) Це було б круто, адже Всесвіт, із законами фізики, як їх зараз відомо, не допускає таких машин.
Jeppe Stig Nielsen

Ні, специфікація не має спеціальних правил для реалізацій, що працюють на нескінченних машинах; всі реалізації можуть скористатися правилами, що регулюють часткову реалізацію нескінченних типів даних.
CM CM Sperberg-McQueen

6

Я просто додам ноту педантизму, яка може бути важливою для деяких людей: неправильно сказати, що xs: int "є" підписане 32-бітове ціле число. Ця форма слів передбачає реалізацію в пам'яті (або регістри тощо) всередині двійкового цифрового комп'ютера. XML базується на символах і реалізує максимальне 32-розрядне підписане значення як "2147483647" (звичайно, мої цитати), що набагато більше 32 біт! Що відповідає дійсності, це те, що xs: int є (опосередковано) обмеженням xs: integer, яке встановлює максимальні та мінімальні дозволені значення таким самим, як відповідні обмеження, накладені реалізацією 32-бітного цілого числа з бітовим знаком.


Немає гарантії, що вихідний інформаційний набір, затверджений XSD, має форму послідовності символів; якщо схема використовується для перевірки екземпляра документа, побудованого за допомогою XSLT або XQuery, є всі можливості, що значення xs: int можна було б представити в пам'яті, використовуючи звичайне подання для 32-бітних цілих чисел.
CM Сперберг-МакКуїн

@ CMSperberg-McQueen, я не впевнений, що я розумію вашу думку. xs: int - це тип з діапазоном, те, як він зберігається, не має значення для XSD, і все, що жорсткі коди "int" як 32-бітове ціле число з пам'яттю, задає проблеми, якщо, наприклад, обрано інший XSD, який говорить int має діапазон, відмінний від діапазону, визначеного в X3D w3c.
Пол Харгрівз

1
@PaulHargreaves - це трохи педантичний момент (у дусі відповіді). Відповідь правильна, що невірно сказати однозначно, що xs: int - це підписане 32-бітове ціле число двоєдоповнення. Але відповідь також говорить про те, що оскільки XML заснований на символах, максимальне значення xs: int є символьним рядком "2147483647"; що останній шматочок не обов'язково такий. Типи XSD використовуються багатьма системами, наприклад, базами даних XQuery, де значення xs: int швидше буде представлене в 32-бітному полі-доповнення двох, ніж як рядок символів Unicode.
CM CM Sperberg-McQueen

використання "представляє" замість "є"
Кріс Уолш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.