XSD: Quelle est la différence entre xs: integer et xs: int?

111

J'ai commencé à créer XSD et j'ai trouvé quelques exemples pour xs:integeret xs:int.

Quelle est la différence entre xs:integeret xs:int? Quand dois-je utiliser xs:integer? Quand dois-je utiliser xs:int?

Michael
la source

Réponses:

110

La différence est la suivante: xs:intest un entier 32 bits signé. xs:integerest une valeur entière illimitée. Voir pour plus de détails https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp Par exemple, XJC (Java) génère Integerpour xs:intet BigIntegerpour xs:integer.

L'essentiel: à utiliser xs:intsi vous souhaitez travailler sur plusieurs plates-formes et assurez-vous que vos numéros passeront sans problème. Si vous voulez des nombres plus grands, utilisez à la xs:longplace de xs:integer(il sera généré vers Long).

Michael
la source
2
Saxon 9 HE (Home Edition) ne prend en charge que «xs: integer , but not xs: int» ou xs:long.
Nishi
13
w3cshools ne fait pas autorité. Pourquoi ne pas référencer les définitions appropriées? w3.org/2001/XMLSchema.xsd indique que l'entier est lié à +/- 9223372036854775808, par exemple. De plus, la multiplateforme n'a rien à voir avec le XML (conforme).
Paul Hargreaves
@Nishi, on dirait que Saxon 9 HE n'est pas conforme. En lisant la page saxon.sourceforge.net, il semble que seule la version EE soit conforme.
Paul Hargreaves
2
@PaulHargreaves, Saxon 9 HE est (pour autant que je sache) un processeur XSLT entièrement conforme: xs: int ne fait pas partie de l'ensemble des types qu'un processeur XSLT de base doit prendre en charge . Si vous voulez dire que ce n'est pas un processeur XSD conforme, c'est vrai mais trompeur: ce n'est pas du tout un processeur XSD.
CM Sperberg-McQueen
8
@PaulHargreaves, votre commentaire sur +/- 9223372036854775808 étant le maximum de "xs: integer" est faux: le XMLSchema.xsd définit qu'un "xs: long" est une restriction de "xs: integer" à +/- 9223372036854775808
metatechbe
30

Le type xs: integer est une restriction de xs: decimal, avec la facette fractionDigits mise à zéro et avec un espace lexical qui interdit le point décimal et les zéros de fin qui seraient autrement légaux. Il n'a pas de valeur minimale ou maximale, bien que les implémentations exécutées sur des machines de taille finie ne soient pas nécessaires pour pouvoir accepter des valeurs arbitrairement grandes ou petites. (Ils doivent prendre en charge les valeurs à 16 chiffres décimaux.)

Le type xs: int est une restriction de xs: long, avec la facette maxInclusive définie sur 2147483647 et la facette minInclusive sur -2147483648. (Comme vous pouvez le voir, il s'intégrera facilement dans un champ entier signé 32 bits à deux compléments; xs: long tient dans un champ entier signé 64 bits.)

La règle habituelle est la suivante: utilisez celui qui correspond à ce que vous voulez dire. Si la contrainte sur un élément ou un attribut est que sa valeur doit être un entier, xs: integer le dit de manière concise. Si la contrainte est que la valeur doit être un entier qui peut être exprimé avec au plus 32 bits dans une représentation à complément de deux, utilisez xs: int. (Une question secondaire mais parfois importante est de savoir si votre chaîne d'outils fonctionne mieux avec l'une qu'avec l'autre. Pour les données qui dureront plus longtemps que votre chaîne d'outils, il est sage d'écouter d'abord les données; pour les données qui existent uniquement pour alimenter l'outil et qui ne seront d'aucun intérêt si vous changez votre chaîne d'outils, il n'y a aucune raison de ne pas écouter la chaîne d'outils.)

CM Sperberg-McQueen
la source
Vous: les implémentations s'exécutant sur des machines de taille finie ne sont pas [...] La norme impose- t-elle aux implémentations s'exécutant sur des machines infinies (comme les machines de Turing et autres) d'accepter et de représenter correctement la gamme complète? :-) Ce serait cool, car l'univers, avec les lois de la physique telles qu'elles sont actuellement connues, n'admet pas de telles machines.
Jeppe Stig Nielsen
Non, la spécification n'a pas de règles spéciales pour les implémentations s'exécutant sur des machines infinies; toutes les implémentations peuvent bénéficier des règles d'implémentation partielle des types de données infinis.
CM Sperberg-McQueen
6

Je voudrais juste ajouter une note de pédantisme qui peut être importante pour certaines personnes: il n'est pas correct de dire que xs: int "est" un entier 32 bits signé. Cette forme de mots implique une implémentation en mémoire (ou registres, etc.) au sein d'un ordinateur numérique binaire. XML est basé sur des caractères et implémenterait la valeur signée maximale de 32 bits en tant que "2147483647" (mes guillemets, bien sûr), ce qui est bien plus que 32 bits! Ce qui est vrai, c'est que xs: int est (indirectement) une restriction de xs: integer qui définit les valeurs maximales et minimales autorisées pour qu'elles soient les mêmes que les limites imposées par l'implémentation correspondantes d'un entier 32 bits avec un bit de signe.

PeteCahill
la source
Il n'y a aucune garantie que le jeu d'infos source validé avec XSD se présente sous la forme d'une séquence de caractères; si le schéma est utilisé pour valider une instance de document construite au moyen de XSLT ou XQuery, il y a toute possibilité qu'une valeur xs: int puisse être représentée en mémoire en utilisant la représentation conventionnelle des entiers 32 bits.
CM Sperberg-McQueen
@ CMSperberg-McQueen, je ne suis pas sûr de comprendre votre argument. xs: int est un type avec une plage, la façon dont il est stocké n'est pas pertinent pour le XSD et tout ce qui code en dur "int" en tant qu'entier signé 32 bits en mémoire pose des problèmes si, par exemple, un XSD différent est choisi qui dit un int a une plage différente de la plage définie dans le XSD w3c.
Paul Hargreaves
1
@PaulHargreaves c'est un point légèrement pédant (dans l'esprit de la réponse). La réponse est juste qu'il n'est pas correct de dire catégoriquement que xs: int est un entier à complément double signé de 32 bits. Mais la réponse dit aussi que puisque XML est basé sur des caractères, la valeur maximale de xs: int est la chaîne de caractères "2147483647"; ce dernier morceau n'est pas nécessairement le cas. Les types XSD sont utilisés par de nombreux systèmes, par exemple les bases de données XQuery, où une valeur xs: int est plus susceptible d'être représentée dans un champ de complément à deux de 32 bits que sous la forme d'une chaîne de caractères Unicode.
CM Sperberg-McQueen
utiliser "représente" à la place de "est"
Chris Walsh