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.