XSD: qual è la differenza tra xs: integer e xs: int?


111

Ho iniziato a creare XSD e ho trovato in un paio di esempi per xs:integere xs:int.

Qual'è la differenza tra xs:integere xs:int? Quando dovrei usarlo xs:integer? Quando dovrei usarlo xs:int?

Risposte:


110

La differenza è la seguente: xs:intè un numero intero a 32 bit con segno. xs:integerè un valore intero illimitato. Vedere per i dettagli https://web.archive.org/web/20151117073716/http://www.w3schools.com/schema/schema_dtypes_numeric.asp Ad esempio, XJC (Java) genera Integerper xs:inte BigIntegerper xs:integer.

In conclusione: usa xs:intse vuoi lavorare su più piattaforme e assicurati che i tuoi numeri passeranno senza problemi. Se vuoi numeri più grandi, usa xs:longinvece di xs:integer(sarà generato a Long).


2
Saxon 9 HE (Home Edition) supporta solo 'xs: integer , but not xs: int` o xs:long.
Nishi

13
w3cshools non è autorevole. Perché non fare riferimento alle definizioni corrette? w3.org/2001/XMLSchema.xsd afferma che il numero intero è vincolato a +/- 9223372036854775808, ad esempio. Inoltre, la multipiattaforma non ha nulla a che fare con xml (conforme).
Paul Hargreaves

@ Nishi, sembra che Saxon 9 HE non sia conforme. Leggendo la pagina saxon.sourceforge.net sembra che solo la versione EE sia conforme.
Paul Hargreaves

2
@PaulHargreaves, Saxon 9 HE è (per quanto ne so) un processore XSLT completamente conforme: xs: int non è nel set di tipi che un processore XSLT di base deve supportare . Se intendi che non è un processore XSD conforme, questo è vero ma fuorviante: non è affatto un processore XSD.
CM Sperberg-McQueen

8
@PaulHargreaves, il tuo commento circa +/- 9223372036854775808 è il massimo di "xs: integer" è sbagliato: XMLSchema.xsd definisce che un "xs: long" è una restrizione di "xs: integer" a +/- 9223372036854775808
metatechbe

30

Il tipo xs: integer è una restrizione di xs: decimal, con il facet fractionDigits impostato su zero e con uno spazio lessicale che proibisce il punto decimale e gli zeri finali che altrimenti sarebbero legali. Non ha un valore minimo o massimo, sebbene le implementazioni in esecuzione su macchine di dimensioni finite non siano richieste per essere in grado di accettare valori arbitrariamente grandi o piccoli. (Sono necessari per supportare valori con 16 cifre decimali.)

Il tipo xs: int è una restrizione di xs: long, con il facet maxInclusive impostato su 2147483647 e il facet minInclusive su -2147483648. (Come puoi vedere, si adatterà comodamente in un campo intero con segno a 32 bit a due complementi; xs: long si adatta a un campo intero con segno a 64 bit.)

La regola usuale è: usa quella che corrisponde a ciò che vuoi dire. Se il vincolo su un elemento o un attributo è che il suo valore deve essere un numero intero, xs: integer lo dice in modo conciso. Se il vincolo è che il valore deve essere un numero intero che può essere espresso con un massimo di 32 bit nella rappresentazione in complemento a due, utilizzare xs: int. (Una preoccupazione secondaria ma a volte importante è se la tua catena di strumenti funziona meglio con l'una che con l'altra. Per i dati che dureranno più a lungo della tua catena di strumenti, è saggio ascoltare prima i dati; per i dati che esistono esclusivamente per alimentare lo strumento catena, e che non sarà di alcun interesse se cambi la catena degli strumenti, non c'è motivo per non ascoltare la catena degli strumenti.)


Tu: le implementazioni in esecuzione su macchine di dimensioni finite non sono richieste per [...] Lo standard ha un requisito che le implementazioni in esecuzione su macchine infinite (come macchine di Turing e cose del genere) debbano accettare e rappresentare adeguatamente l'intera gamma? :-) Sarebbe bello, perché l'universo, con le leggi della fisica come sono attualmente note, non ammette macchine del genere.
Jeppe Stig Nielsen

No, la specifica non ha regole speciali per le implementazioni in esecuzione su macchine infinite; tutte le implementazioni possono beneficiare delle regole che governano l'implementazione parziale degli infiniti tipi di dati.
CM Sperberg-McQueen

6

Vorrei solo aggiungere una nota di pedanteria che potrebbe essere importante per alcune persone: non è corretto dire che xs: int "è" un intero con segno a 32 bit. Questa forma di parole implica un'implementazione in memoria (o registri, ecc.) All'interno di un computer digitale binario. XML è basato sui caratteri e implementerebbe il valore con segno massimo a 32 bit come "2147483647" (le mie virgolette, ovviamente), che è molto più di 32 bit! Ciò che è vero è che xs: int è (indirettamente) una restrizione di xs: integer che imposta i valori massimi e minimi consentiti in modo che corrispondano ai corrispondenti limiti imposti dall'implementazione di un intero a 32 bit con un bit di segno.


Non vi è alcuna garanzia che il source infoset convalidato con XSD si presenti sotto forma di una sequenza di caratteri; se lo schema viene utilizzato per convalidare un'istanza di documento costruita mediante XSLT o XQuery, ci sono tutte le possibilità che un valore xs: int possa essere rappresentato in memoria utilizzando la rappresentazione convenzionale per interi a 32 bit.
CM Sperberg-McQueen

@ CMSperberg-McQueen, non sono sicuro di aver capito il tuo punto. xs: int è un tipo con un intervallo, come viene memorizzato è irrilevante per l'XSD e tutto ciò che codifica "int" come intero con segno a 32 bit in memoria sta chiedendo problemi se, ad esempio, viene scelto un XSD diverso che dice un int ha un intervallo diverso da quello definito nell'XSD w3c.
Paul Hargreaves

1
@PaulHargreaves è un punto leggermente pedante (nello spirito della risposta). La risposta è giusta che non è corretto affermare chiaramente che xs: int è un intero con complemento a due a 32 bit con segno. Ma la risposta dice anche che poiché XML è basato sui caratteri, il valore massimo di xs: int è la stringa di caratteri "2147483647"; l'ultima cosa non è necessariamente così. I tipi XSD sono usati da molti sistemi, ad esempio database XQuery, dove è più probabile che un valore xs: int sia rappresentato in un campo a due complementi a 32 bit piuttosto che come una stringa di caratteri Unicode.
CM Sperberg-McQueen

utilizzare "rappresenta" al posto di "è"
Chris Walsh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.